Skip to content
Snippets Groups Projects
CMakeLists.txt 8.1 KiB
Newer Older
PROJECT(ChimeraTK-ApplicationCore)
mhier's avatar
mhier committed
cmake_minimum_required(VERSION 2.8)

include(cmake/add_dependency.cmake)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules)
mhier's avatar
mhier committed

set(${PROJECT_NAME}_MAJOR_VERSION 01)
set(${PROJECT_NAME}_MINOR_VERSION 10)
set(${PROJECT_NAME}_PATCH_VERSION 00)
mhier's avatar
mhier committed

option(BUILD_TESTS "Build tests." ON)
option(BUILD_MICRODAQ "Build MicroDAQ module, which depends on HDF5 (libhdf5-dev)." ON)
add_dependency(ChimeraTK-ControlSystemAdapter 01.05 REQUIRED)
# The dependency on DeviceAccess, incl. the linker flag already comes with the
# controlsystem adapter. As we use DeviceAccess directly and need features from
# a certain version number (which does not necessarily reflect in the CS adapter's
# version number) we add an extra FIND_PACKAGE (not add_dependency, which
# would add all the flags again).
FIND_PACKAGE(ChimeraTK-DeviceAccess 01.08 REQUIRED)

# Find the XML parser library libxml++
FIND_PACKAGE(PkgConfig REQUIRED)
set(LIBXML++_VERSION "libxml++-2.6")
PKG_CHECK_MODULES(LibXML++ REQUIRED ${LIBXML++_VERSION})
PKG_CHECK_MODULES(glib REQUIRED glib-2.0)
include_directories(SYSTEM ${glib_INCLUDE_DIRS} ${LibXML++_INCLUDE_DIRS})
# optional dependency: BOOST unit test framework needed for tests
IF(BUILD_TESTS)
  IF(Boost_UNIT_TEST_FRAMEWORK_FOUND)
    set(TESTING_IS_ENABLED "true")
    ENABLE_TESTING()
  ELSE()
    message(" The following packages were not found, so testing will be disabled:")
    message("  * BOOST unit_test_framework")
  ENDIF()
ENDIF(BUILD_TESTS)
# Find BOOST filesystem
# Note: we need to search this after looking for the unit_test_framework, since we must not link against the
#       unit_test_framework library (use header-only)
FIND_PACKAGE(Boost COMPONENTS filesystem date_time chrono system thread REQUIRED)
# requierd dependency: HDF5 library needed for the MicroDAQ system (TODO make optional!)
option(BUILD_MICRODAQ "Build the MicroDAQ module, which depends on HDF5 (libhdf5-dev)." ON)
if(BUILD_MICRODAQ)
Martin Killenberg's avatar
Martin Killenberg committed
  FIND_PACKAGE(HDF5 COMPONENTS CXX)
  IF(HDF5_FOUND)
    include_directories(SYSTEM ${HDF5_INCLUDE_DIRS})
    link_directories(${HDF5_LIBRARY_DIRS})
    # add flag to be used in user code to test weather MicroDAQ is included
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DENABLE_MICRO_DAQ")
  ELSE()
    set(HDF5_LIBRARIES "")
    message(" HDF5 was not found, so the MicroDAQ system will not be built.")
  ENDIF()
endif(BUILD_MICRODAQ)
include(cmake/set_default_build_to_release.cmake)
include(cmake/set_default_flags.cmake)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--export-dynamic ${ChimeraTK-ControlSystemAdapter_LINK_FLAGS}")
mhier's avatar
mhier committed

include_directories(${CMAKE_SOURCE_DIR}/include)
set(${PROJECT_NAME}_INCLUDE_DIRS ${${PROJECT_NAME}_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/include/ ${CMAKE_SOURCE_DIR}/Modules/include/)
mhier's avatar
mhier committed
aux_source_directory(${CMAKE_SOURCE_DIR}/src library_sources)

# add generic modules
include_directories(${CMAKE_SOURCE_DIR}/Modules/include)
aux_source_directory(${CMAKE_SOURCE_DIR}/Modules/src library_sources)

Martin Killenberg's avatar
Martin Killenberg committed
if((NOT BUILD_MICRODAQ) OR (NOT HDF5_FOUND))
  LIST(REMOVE_ITEM library_sources ${CMAKE_SOURCE_DIR}/Modules/include/MicroDAQ.h)
  LIST(REMOVE_ITEM library_sources ${CMAKE_SOURCE_DIR}/Modules/src/MicroDAQ.cc)
Martin Killenberg's avatar
Martin Killenberg committed
endif((NOT BUILD_MICRODAQ) OR (NOT HDF5_FOUND))
mhier's avatar
mhier committed
MACRO( COPY_MAPPING_FILES )
  foreach( FILE_TO_COPY test.xlmap test.dmap )
    configure_file( tests/${FILE_TO_COPY} ${PROJECT_BINARY_DIR}/${FILE_TO_COPY} copyonly)
  endforeach( FILE_TO_COPY )
ENDMACRO( COPY_MAPPING_FILES )

# Create the executables for automated unit testing.
mhier's avatar
mhier committed
if(TESTING_IS_ENABLED)
  include_directories(${CMAKE_SOURCE_DIR}/tests/include)
mhier's avatar
mhier committed
  aux_source_directory(${CMAKE_SOURCE_DIR}/tests/executables_src testExecutables)
  foreach( testExecutableSrcFile ${testExecutables})
    #NAME_WE means the base name without path and (longest) extension
    get_filename_component(executableName ${testExecutableSrcFile} NAME_WE)
    add_executable(${executableName} ${testExecutableSrcFile} )
    # do not link against the boost unit test library, the tests are not written for it!
    target_link_libraries(${executableName} ${PROJECT_NAME} ${ChimeraTK-ControlSystemAdapter_LIBRARIES} ${HDF5_LIBRARIES})
    set_target_properties(${executableName} PROPERTIES LINK_FLAGS "-Wl,-rpath,${PROJECT_BINARY_DIR} ${Boost_LINK_FLAGS} ${ChimeraTK-ControlSystemAdapter_LINK_FLAGS}")
    add_test(${executableName} ${executableName})
mhier's avatar
mhier committed
  endforeach( testExecutableSrcFile )

  # enable code coverate report
  include(cmake/enable_code_coverage_report.cmake)
mhier's avatar
mhier committed

  FILE( COPY ${CMAKE_SOURCE_DIR}/tests/test.map DESTINATION ${PROJECT_BINARY_DIR})
  FILE( COPY ${CMAKE_SOURCE_DIR}/tests/test2.map DESTINATION ${PROJECT_BINARY_DIR})
  FILE( COPY ${CMAKE_SOURCE_DIR}/tests/test3.map DESTINATION ${PROJECT_BINARY_DIR})
  FILE( COPY ${CMAKE_SOURCE_DIR}/tests/test4.map DESTINATION ${PROJECT_BINARY_DIR})
  FILE( COPY ${CMAKE_SOURCE_DIR}/tests/test.dmap DESTINATION ${PROJECT_BINARY_DIR})
  FILE( COPY ${CMAKE_SOURCE_DIR}/tests/validConfig.xml DESTINATION ${PROJECT_BINARY_DIR})
  FILE( COPY ${CMAKE_SOURCE_DIR}/xmlschema/application.xsd DESTINATION ${PROJECT_BINARY_DIR})
mhier's avatar
mhier committed
endif(TESTING_IS_ENABLED)

# C++ library
add_library(${PROJECT_NAME} SHARED ${library_sources} )
set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${${PROJECT_NAME}_FULL_LIBRARY_VERSION}
                                                 SOVERSION ${${PROJECT_NAME}_SOVERSION})
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "${ChimeraTK-ControlSystemAdapter_LINK_FLAGS}")
target_link_libraries(${PROJECT_NAME} ${ChimeraTK-ControlSystemAdapter_LIBRARIES}
                                      ${glib_LIBRARIES}
                                      ${HDF5_LIBRARIES})
mhier's avatar
mhier committed

# do not remove runtime path of the library when installing
set_property(TARGET ${PROJECT_NAME} PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
mhier's avatar
mhier committed

# add a target to generate API documentation with Doxygen
include(cmake/enable_doxygen_documentation.cmake)
mhier's avatar
mhier committed

# Install the library and the executables
install( TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin LIBRARY DESTINATION lib )
mhier's avatar
mhier committed

# all include files go into include/PROJECT_NAME
# The exclusion of ${PROJECT_NAME} prevents the recursive installation of the files just being installed.
# The original headers are in include/*.h, the installed ones in include/PROJECT_NAME/*.h.
Martin Killenberg's avatar
Martin Killenberg committed
if((NOT BUILD_MICRODAQ) OR (NOT HDF5_FOUND))
  install(DIRECTORY ${${PROJECT_NAME}_INCLUDE_DIRS} DESTINATION include/ChimeraTK/ApplicationCore
                                                    FILES_MATCHING PATTERN "*.h"
                                                                   PATTERN ".svn" EXCLUDE
                                                                   PATTERN "${PROJECT_NAME}" EXCLUDE
                                                                   PATTERN "*MicroDAQ.h" EXCLUDE
                                                    )
else()
  install(DIRECTORY ${${PROJECT_NAME}_INCLUDE_DIRS} DESTINATION include/ChimeraTK/ApplicationCore
                                                    FILES_MATCHING PATTERN "*.h"
                                                                   PATTERN ".svn" EXCLUDE
                                                                   PATTERN "${PROJECT_NAME}" EXCLUDE)
Martin Killenberg's avatar
Martin Killenberg committed
endif((NOT BUILD_MICRODAQ) OR (NOT HDF5_FOUND))
mhier's avatar
mhier committed

set(${PROJECT_NAME}_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/include")
set(${PROJECT_NAME}_LIBRARIES "${ChimeraTK-ControlSystemAdapter_LIBRARIES} ${HDF5_LIBRARIES}")
set(${PROJECT_NAME}_LIBRARY_DIRS "${CMAKE_INSTALL_PREFIX}/lib")
set(${PROJECT_NAME}_CXX_FLAGS "${ChimeraTK-ControlSystemAdapter_CXX_FLAGS}")
set(${PROJECT_NAME}_LINK_FLAGS "${ChimeraTK-ControlSystemAdapter_LINK_FLAGS}")
Jens Georg's avatar
Jens Georg committed
list(APPEND ${PROJECT_NAME}_PUBLIC_DEPENDENCIES "Boost COMPONENTS system thread chrono filesystem date_time atomic")
include(${CMAKE_SOURCE_DIR}/cmake/create_cmake_config_files.cmake)