om@2: # ------------------------------------------------------------ om@2: # CMakeLists.txt the AIT OpenSecurity ShadowFUSE om@2: # om@2: # Autor: Oliver Maurhart, om@2: # om@2: # Copyright (C) 2013 AIT Austrian Institute of Technology om@2: # AIT Austrian Institute of Technology GmbH om@2: # Donau-City-Strasse 1 | 1220 Vienna | Austria om@2: # http://www.ait.ac.at om@2: # om@2: # This program is free software; you can redistribute it and/or om@2: # modify it under the terms of the GNU General Public License om@2: # version 2 as published by the Free Software Foundation. om@2: # om@2: # This program is distributed in the hope that it will be useful, om@2: # but WITHOUT ANY WARRANTY; without even the implied warranty of om@2: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the om@2: # GNU General Public License for more details. om@2: # om@2: # You should have received a copy of the GNU Lesser General Public om@2: # License along with this library; if not, write to the om@2: # Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, om@2: # Boston, MA 02110-1301, USA. om@2: # ------------------------------------------------------------ om@2: om@2: # project data om@2: project(os-server C CXX) om@2: cmake_minimum_required(VERSION 2.6) om@2: om@2: # load necessary basic cmake modules om@2: include(CheckIncludeFile) om@2: include(CheckIncludeFiles) om@2: include(CheckLibraryExists) om@2: include(FindPkgConfig) om@2: include(FindPythonInterp) om@2: om@2: # enable tests om@2: ENABLE_TESTING() om@2: om@2: om@2: # ------------------------------------------------------------ om@2: # set global compiler flags om@2: om@2: set(VERSION "0.1") om@2: add_definitions(-DVERSION=\"${VERSION}\") om@2: om@2: # we relay on a GNU/BSD SOURCE om@2: add_definitions(-D_GNU_SOURCE) om@2: add_definitions(-D_BSD_SOURCE) om@2: om@2: # set compile flags om@2: if (CMAKE_COMPILER_IS_GNUCC) om@2: om@2: # tweak capabilities of gcc versions prior to 4.8 om@2: if (${CMAKE_C_COMPILER_VERSION} LESS 4.8) om@2: om@2: message(STATUS "gcc compiler < 4.8 detected - tweaking flags") om@2: om@2: # make this clear: we use std::thread om@2: # so enforce pthread bindings om@2: # this may not be needed for gcc >= 4.8 om@2: add_definitions(-pthread) om@2: om@2: # this is needed to have om@2: # std::_this_thread::sleep(...) om@2: # at hand - at least for gcc 4.6.3 and glibc 2.15 om@2: add_definitions(-D_GLIBCXX_USE_NANOSLEEP) om@2: om@2: # this is needed to have om@2: # std::_this_thread::yield() om@2: # at hand - at least for gcc 4.6.3 and glibc 2.15 om@2: add_definitions(-D_GLIBCXX_USE_SCHED_YIELD) om@2: om@2: endif (${CMAKE_C_COMPILER_VERSION} LESS 4.8) om@2: om@2: set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -Werror -Wall -Wextra -pedantic -g -ggdb3 -rdynamic") om@2: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x -Werror -Wall -Wextra -pedantic -g -ggdb3 -rdynamic") om@2: om@2: # TODO: make speed tests with -fno-builtin especially to om@2: # get a better memcpy performance om@2: #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-builtin") om@2: #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin") om@2: om@2: endif (CMAKE_COMPILER_IS_GNUCC) om@2: om@2: # additional debug and profiling options om@2: option(DEBUG_MODE_ENABLED "enable debug mode" off) om@2: if (CMAKE_COMPILER_IS_GNUCC) om@2: if (DEBUG_MODE_ENABLED) om@2: message(STATUS "debug and profiling mode enabled") om@2: set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -pg --coverage") om@2: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -pg --coverage") om@2: else(DEBUG_MODE_ENABLED) om@2: message(STATUS "debug and profiling mode disabled: go for optimizations") om@2: set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3") om@2: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") om@2: endif(DEBUG_MODE_ENABLED) om@2: endif (CMAKE_COMPILER_IS_GNUCC) om@2: om@2: om@2: # ------------------------------------------------------------ om@2: # check for an existing python module (maybe extra) om@2: om@2: macro(CHECK_PYTHON_MODULE VARIABLE MODULE) om@2: om@2: message(STATUS "Looking for python module ${MODULE}") om@2: om@2: if (PYTHONINTERP_FOUND) om@2: om@2: execute_process( om@2: COMMAND ${PYTHON_EXECUTABLE} -c "import ${MODULE}" om@2: RESULT_VARIABLE _result om@2: OUTPUT_QUIET om@2: ERROR_QUIET om@2: ) om@2: om@2: if ("${_result}" EQUAL "0") om@2: set (${VARIABLE}_FOUND TRUE) om@2: endif ("${_result}" EQUAL "0") om@2: om@2: endif (PYTHONINTERP_FOUND) om@2: om@2: if (${VARIABLE}_FOUND) om@2: message(STATUS "Looking for python module ${MODULE} - found") om@2: else (${VARIABLE}_FOUND) om@2: message(STATUS "Looking for python module ${MODULE} - not found") om@2: endif (${VARIABLE}_FOUND) om@2: om@2: endmacro(CHECK_PYTHON_MODULE MODULE) om@2: om@2: om@2: # ------------------------------------------------------------ om@2: # check libs and packages (headers + lib) om@2: om@2: # standard C files om@2: check_include_file(stdio.h HAVE_STDIO_H) om@2: check_include_file(stddef.h HAVE_STDDEF_H) om@2: check_include_file(stdlib.h HAVE_STDLIB_H) om@2: check_include_file(inttypes.h HAVE_INTTYPES_H) om@2: check_include_file(memory.h HAVE_MEMORY_H) om@2: check_include_file(string.h HAVE_STRING_H) om@2: check_include_file(unistd.h HAVE_UNISTD_H) om@2: om@2: # time om@2: check_include_file(sys/time.h HAVE_SYS_TIME_H) om@2: check_include_file(time.h HAVE_TIME_H) om@2: om@2: # file system stuff om@2: check_include_file(fcntl.h HAVE_FCNTL_H) om@2: check_include_file(sys/stat.h HAVE_SYS_STAT_H) om@2: om@2: # math om@2: check_include_file(math.h HAVE_MATH_H) om@2: om@2: # stdbool om@2: check_include_file(stdbool.h HAVE_STDBOOL_H) om@2: om@2: # endian om@2: check_include_file(endian.h HAVE_ENDIAN_H) om@2: om@2: # math.h om@2: check_include_file(math.h HAVE_MATH_H) om@2: om@2: # networking om@2: check_include_file(netdb.h HAVE_NETDB_H) om@2: check_include_file(ifaddrs.h HAVE_IFADDRS_H) om@2: check_include_file(netinet/in.h HAVE_NETINET_IN_H) om@2: check_include_file(arpa/inet.h HAVE_ARPA_INET_H) om@2: check_include_file(sys/socket.h HAVE_SYS_SOCKET_H) om@2: check_include_file(sys/un.h HAVE_SYS_UN_H) om@2: om@2: # assert om@2: check_include_file(assert.h HAVE_ASSERT_H) om@2: om@2: # signal om@2: check_include_file(signal.h HAVE_SIGNAL_H) om@2: om@2: # sys/uio om@2: check_include_file(sys/uio.h HAVE_SYS_UIO_H) om@2: om@2: # syslog om@2: check_include_file(syslog.h HAVE_SYSLOG_H) om@2: om@2: # errno om@2: check_include_file(errno.h HAVE_ERRNO_H) om@2: om@2: # limits om@2: check_include_file(limits.h HAVE_LIMITS_H) om@2: om@2: # sys/mman.h om@2: check_include_file(sys/mman.h HAVE_SYS_MMAN_H) om@2: om@2: # dirent.h om@2: check_include_file(dirent.h HAVE_DIRENT_H) om@2: om@2: # fuse.h om@2: pkg_check_modules(FUSE REQUIRED fuse) om@2: if (FUSE_FOUND) om@2: set(HAVE_FUSE_H 1) om@2: set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FUSE_CFLAGS_OTHER}") om@2: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FUSE_CFLAGS_OTHER}") om@2: set(CMAKE_REQUIRED_LIBRARIES "${FUSE_LIBRARIES};${CMAKE_REQUIRED_LIBRARIES}") om@2: endif (FUSE_FOUND) om@2: om@2: # check python module dbus om@2: check_python_module(PYTHON_DBUS dbus) om@2: if (NOT PYTHON_DBUS_FOUND) om@2: message(FATAL_ERROR "python module 'dbus' missing.") om@2: endif (NOT PYTHON_DBUS_FOUND) om@2: om@2: # check python module fuse om@2: check_python_module(PYTHON_FUSE fuse) om@2: if (NOT PYTHON_FUSE_FOUND) om@2: message(FATAL_ERROR "python module 'fuse' missing. please install 'fuse-python'.") om@2: endif (NOT PYTHON_FUSE_FOUND) om@2: om@2: # check python module web om@2: check_python_module(PYTHON_WEB web) om@2: if (NOT PYTHON_WEB_FOUND) om@2: message(FATAL_ERROR "python module 'web' missing. please install 'web.py'.") om@2: endif (NOT PYTHON_WEB_FOUND) om@2: om@2: om@2: # ------------------------------------------------------------ om@2: # dump the config file om@2: om@2: # create the config.h and baseinc.h om@2: configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) om@2: include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) om@2: om@2: om@2: # ------------------------------------------------------------ om@2: # go through the subs om@2: om@2: add_subdirectory(bin) om@2: om@2: om@2: # ------------------------------------------------------------ om@2: # additional stuff for installation om@2: om@2: install(DIRECTORY etc/dbus-1 DESTINATION /etc) om@2: om@2: om@2: # ------------------------------------------------------------ om@2: # packaging om@2: om@2: set(CPACK_PACKAGE_NAME "opensecurity") om@2: om@2: set(CPACK_PACKAGE_DESCRIPTION "OpenSecurity System") om@2: set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "This is the OpenSecurity System suite to be insalled into a Security VM") om@2: set(CPACK_PACKAGE_CONTACT "Oliver Maurhart ") om@2: set(CPACK_PACKAGE_VENDOR "AIT") om@2: set(CPACK_PACKAGE_VERSION_MAJOR "0") om@2: set(CPACK_PACKAGE_VERSION_MINOR "1") om@2: set(CPACK_PACKAGE_VERSION_PATCH "0") om@2: set(CPACK_PROJECT_VERSION_STRING "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}" ) om@2: om@2: set(CPACK_GENERATOR "DEB;RPM;") om@2: set(CPACK_SOURCE_GENERATOR "TGZ") om@2: om@2: set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}-${CMAKE_SYSTEM_PROCESSOR}") om@2: set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}") om@2: set(CPACK_SOURCE_IGNORE_FILES "/build/*;/.git/") om@2: om@2: set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.13), libgcc1 (>= 1:4.4), python (>= 2.7)") om@2: set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cpack/deb/control/postinst;${CMAKE_CURRENT_SOURCE_DIR}/cmake/cpack/deb/control/postrm;${CMAKE_CURRENT_SOURCE_DIR}/cmake/cpack/deb/control/prerm;") om@2: om@2: # debianization om@2: string(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_PACKAGE_NAME_LOWERCASE) om@2: find_program(DPKG_PROGRAM dpkg DOC "dpkg program of Debian-based systems") om@2: if (DPKG_PROGRAM) om@2: # use dpkg to fix the package file name om@2: execute_process( om@2: COMMAND ${DPKG_PROGRAM} --print-architecture om@2: OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE om@2: OUTPUT_STRIP_TRAILING_WHITESPACE om@2: ) om@2: set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME_LOWERCASE}_${CPACK_PROJECT_VERSION_STRING}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}") om@2: else (DPKG_PROGRAM) om@2: set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME_LOWERCASE}_${CPACK_PROJECT_VERSION_STRING}_${CMAKE_SYSTEM_NAME}") om@2: endif (DPKG_PROGRAM) om@2: om@2: # package it om@2: include(CPack) om@2: