# See more at: https://cmake.org/Wiki/CMake_Useful_Variables # Stop if cmake version below 2.8 cmake_minimum_required(VERSION 2.8 FATAL_ERROR) # Project name project(anna) # Enable c++ language enable_language(C CXX) # Project version set(VERSION_MAJOR 1) set(VERSION_MINOR 0) set(VERSION_PATCH 6) # Dynamic libraries not linked to build tree: set(CMAKE_SKIP_RPATH TRUE) # Build type: if(NOT CMAKE_BUILD_TYPE) message(WARNING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel.") set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) endif(NOT CMAKE_BUILD_TYPE) message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}") # Build output directory: set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE}/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE}/lib) message(STATUS "CMAKE_RUNTIME_OUTPUT_DIRECTORY is ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") message(STATUS "CMAKE_LIBRARY_OUTPUT_DIRECTORY is ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") message(STATUS "CMAKE_ARCHIVE_OUTPUT_DIRECTORY is ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}") # http://stackoverflow.com/questions/6594796/how-do-i-make-cmake-output-into-a-bin-dir #set_target_properties( targets... # PROPERTIES # ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" # LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" # RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" #) # Location of additional cmake modules set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake ) # Detect operating system message(STATUS "This is a ${CMAKE_SYSTEM_NAME} system") if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") add_definitions(-DSYSTEM_LINUX) endif() if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") add_definitions(-DSYSTEM_DARWIN) endif() if(${CMAKE_SYSTEM_NAME} STREQUAL "AIX") add_definitions(-DSYSTEM_AIX) endif() # Detect host processor message(STATUS "The host processor is ${CMAKE_HOST_SYSTEM_PROCESSOR}") message(STATUS "The c compiler is ${CMAKE_C_COMPILER}") message(STATUS "The c++ compiler is ${CMAKE_CXX_COMPILER}") message(STATUS "The build type is ${CMAKE_BUILD_TYPE}") # Example how to set c++ compiler flags for GNU message(STATUS "CMAKE_CXX_COMPILER_ID = ${CMAKE_CXX_COMPILER_ID}") if(CMAKE_CXX_COMPILER_ID MATCHES GNU) #execute_process(COMMAND g++ --version >/dev/null 2>/dev/null) set(CMAKE_CXX_COMPILER "/usr/bin/g++") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Wno-deprecated -Wwrite-strings -Wno-unknown-pragmas -Wno-sign-compare -Wno-maybe-uninitialized -Wno-unused -Wno-reorder") set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3") set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG") set(CMAKE_CXX_FLAGS_RELEASE "-O3") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") elseif(CMAKE_CXX_COMPILER_ID MATCHES Clang) #execute_process(COMMAND clang++ --version >/dev/null 2>/dev/null) add_definitions(-DIS_CLANG) set(CMAKE_CXX_COMPILER "/usr/bin/clang++") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Wno-deprecated -Wwrite-strings -Wno-unknown-pragmas -Wno-sign-compare -Wno-maybe-uninitialized -Wno-unused -Wno-reorder -Wno-parentheses-equality") set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3") set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG") set(CMAKE_CXX_FLAGS_RELEASE "-O3") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") endif() if (CMAKE_BUILD_TYPE STREQUAL Debug) set(BUILD_POSTFIX "_d") else(CMAKE_BUILD_TYPE STREQUAL Debug) set(BUILD_POSTFIX "") endif(CMAKE_BUILD_TYPE STREQUAL Debug) # Macro to get children directories: MACRO(SUBDIRLIST result curdir) FILE(GLOB children RELATIVE ${curdir} ${curdir}/*) SET(dirlist "") FOREACH(child ${children}) # EXCLUDE DATABASE RESOURCES (-DSKIP_DATABASE_BUILD) if(SKIP_DATABASE_BUILD) string(REGEX MATCH "dbms|dbos" DATABASE ${child}) IF(DATABASE) CONTINUE() ENDIF() ENDIF() IF(IS_DIRECTORY ${curdir}/${child}) LIST(APPEND dirlist ${child}) ENDIF() ENDFOREACH() SET(${result} ${dirlist}) ENDMACRO() # Definitions (any way to apply only at ldap context ?): add_definitions(-DLDAP_DEPRECATED) # General includes: include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) include_directories(/usr/include/libxml2) include_directories(/usr/include/oracle/19.6/client64) # SUBDIRLIST(SUBDIRS ${CMAKE_CURRENT_SOURCE_DIR}/source) FOREACH(subdir ${SUBDIRS}) message(STATUS "Processing library at: source/${subdir}") file(GLOB_RECURSE SRCS source/${subdir}/*.cpp) add_library(anna_${subdir}_static STATIC ${SRCS}) add_library(anna_${subdir}_shared SHARED ${SRCS}) ENDFOREACH() # file(GLOB_RECURSE DYNAMIC_PROCEDURES ${CMAKE_CURRENT_SOURCE_DIR}/dynamic/launcher/*.cpp) FOREACH(procedure ${DYNAMIC_PROCEDURES}) get_filename_component(dirname ${procedure} DIRECTORY) file(RELATIVE_PATH rel ${CMAKE_CURRENT_SOURCE_DIR}/dynamic/launcher ${dirname}) # convert "/" to "_" string(REGEX REPLACE "/" "_" libpath ${rel}) message(STATUS "Processing dynamic library at: dynamic/launcher/${rel}") file(GLOB_RECURSE SRCS dynamic/launcher/${rel}/*.cpp) add_library(anna_launcher_procedure_${libpath}_shared SHARED ${SRCS}) set(target_dirname ${CMAKE_CURRENT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE}/lib/dynamic/launcher/${rel}) set(target_basename anna_launcher_procedure_${libpath}_shared) set_target_properties(${target_basename} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${target_dirname}) #file(RENAME ${target_dirname}/lib${target_basename}.so ${target_dirname}/libprocedure.so) ENDFOREACH() # Generalization: # SUBDIRLIST(MODULES ${CMAKE_CURRENT_SOURCE_DIR}/example) FOREACH(module ${MODULES}) SUBDIRLIST(SUBDIRS ${CMAKE_CURRENT_SOURCE_DIR}/example/${module}) FOREACH(subdir ${SUBDIRS}) message(STATUS "Processing executable at: example/${module}/${subdir}") # Sources file(GLOB_RECURSE SRCS ${CMAKE_CURRENT_SOURCE_DIR}/example/${module}/${subdir}/*.cpp) # Executable set(target "anna_${module}_${subdir}") add_executable(${target} ${SRCS}) set_target_properties(${target} PROPERTIES LINKER_LANGUAGE CXX) set(libraries_file "${CMAKE_CURRENT_SOURCE_DIR}/example/${module}/${subdir}/libraries.txt") set(includes_file "${CMAKE_CURRENT_SOURCE_DIR}/example/${module}/${subdir}/includes.txt") if(EXISTS "${includes_file}") file (STRINGS "${includes_file}" HDRS) # Include own example directory: target_include_directories(${target} PUBLIC $ ) FOREACH(HDR ${HDRS}) #message(STATUS "Header directory: ${HDR}") target_include_directories(${target} PUBLIC $ ) ENDFOREACH() endif() if(EXISTS "${libraries_file}") file (STRINGS "${libraries_file}" LIBS) #message(STATUS "Libraries: ${LIBS}") target_link_libraries(${target} ${LIBS}) endif() ENDFOREACH() ENDFOREACH() # find_package(GTest) IF(GTest_FOUND) enable_testing() include_directories(${GTEST_INCLUDE_DIRS}) SUBDIRLIST(MODULES ${CMAKE_CURRENT_SOURCE_DIR}/test) FOREACH(module ${MODULES}) message(STATUS "Processing basic test at: test/${module}") # Sources file(GLOB_RECURSE SRCS ${CMAKE_CURRENT_SOURCE_DIR}/test/${module}/*.cpp) # Executable set(target "anna_test_${module}") add_executable(${target} ${SRCS}) target_link_libraries(${target} ${GTEST_BOTH_LIBRARIES} pthread) set(libraries_file "${CMAKE_CURRENT_SOURCE_DIR}/test/${module}/libraries.txt") if(EXISTS "${libraries_file}") file (STRINGS "${libraries_file}" LIBS) #message(STATUS "Libraries: ${LIBS}") target_link_libraries(${target} ${GTEST_BOTH_LIBRARIES} pthread ${LIBS}) endif() add_test(${target} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${target}) ENDFOREACH() ENDIF(GTest_FOUND) # Install SET(MY_OWN_INSTALL_PREFIX "/opt/anna" CACHE PATH "Prefix prepended to install directories") SET(CMAKE_INSTALL_PREFIX "${MY_OWN_INSTALL_PREFIX}" CACHE INTERNAL "Prefix prepended to install directories" FORCE) message(STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}") # Binaries: file(GLOB_RECURSE BINARIES ${CMAKE_CURRENT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE}/bin/*) install(PROGRAMS ${BINARIES} DESTINATION bin) # Headers: install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/anna DESTINATION include) # Libraries: file(GLOB_RECURSE LIBRARIES ${CMAKE_CURRENT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE}/lib/*) install(FILES ${LIBRARIES} DESTINATION lib) # Add target for API documentation with Doxygen find_package(Doxygen) IF(Doxygen_FOUND) add_custom_target(doc ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/docs/doxygen/Doxyfile WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docs/doxygen COMMENT "Generating API documentation with Doxygen" VERBATIM ) ENDIF(Doxygen_FOUND)