First cmake commit. Still coexisting with scons.
[anna.git] / CMakeLists.txt
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..7acd9b1
--- /dev/null
@@ -0,0 +1,226 @@
+# 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 0)
+
+# 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)
+
+# Build output directory:
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY build/${CMAKE_BUILD_TYPE}/bin)
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY build/${CMAKE_BUILD_TYPE}/lib)
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY 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
+if(CMAKE_CXX_COMPILER_ID MATCHES GNU)
+    #execute_process(COMMAND g++ --version >/dev/null 2>/dev/null)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wno-unknown-pragmas -Wno-sign-compare -Woverloaded-virtual -Wwrite-strings -Wno-unused")
+    set(CMAKE_CXX_FLAGS_DEBUG   "-O0 -g3")
+    set(CMAKE_CXX_FLAGS_RELEASE "-O3")
+
+elseif(CMAKE_CXX_COMPILER_ID MATCHES Clang)
+    #execute_process(COMMAND clang++ --version >/dev/null 2>/dev/null)
+    add_definitions(-DIS_CLANG)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wno-unknown-pragmas -Wno-sign-compare -Woverloaded-virtual -Wwrite-strings -Wno-unused -Wno-parentheses-equality")
+    set(CMAKE_CXX_FLAGS_DEBUG   "-O0 -g3")
+    set(CMAKE_CXX_FLAGS_RELEASE "-O3")
+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})
+    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(include/anna)
+include_directories(/usr/include/libxml2)
+include_directories(/usr/lib/oracle/12.1/client64/include)
+
+# <source>
+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(${subdir}_static STATIC ${SRCS})
+  add_library(${subdir}_shared SHARED ${SRCS})
+ENDFOREACH()
+
+# <dynamic>
+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(launcher_procedure_${libpath}_shared SHARED ${SRCS})
+  set(target_dirname build/${CMAKE_BUILD_TYPE}/lib/dynamic_launcher/${libpath})
+  set(target_basename 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()
+
+# Linking example:
+#file(GLOB_RECURSE SRCS ${CMAKE_CURRENT_SOURCE_DIR}/example/core/genLogon/*.cpp)
+#add_executable(genLogon ${SRCS})
+#target_link_libraries(genLogon core_static app_static core_static test_static xml_static io_static crypto xml2 rt)
+
+# Generalization:
+# <example>
+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 "${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
+        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/example/${module}/${subdir}>
+      )
+      FOREACH(HDR ${HDRS})
+        #message(STATUS "Header directory: ${HDR}")
+        target_include_directories(${target} PUBLIC
+          $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${HDR}>
+        )
+      ENDFOREACH()
+    endif()
+
+    if(EXISTS "${libraries_file}")
+      file (STRINGS "${libraries_file}" LIBS)
+      #message(STATUS "Libraries: ${LIBS}")
+      target_link_libraries(${target} ${LIBS})
+    endif()
+
+  ENDFOREACH()
+ENDFOREACH()
+
+
+# <test>
+find_package(Boost COMPONENTS system filesystem REQUIRED)
+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 "${module}")
+  find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
+  add_executable(${target} "${SRCS}")
+  set_target_properties(${target} PROPERTIES LINKER_LANGUAGE CXX)
+
+
+  set(libraries_file "${CMAKE_CURRENT_SOURCE_DIR}/example/${module}/${subdir}/libraries.txt")
+
+  if(EXISTS "${libraries_file}")
+    file (STRINGS "${libraries_file}" LIBS)
+    #message(STATUS "Libraries: ${LIBS}")
+    target_link_libraries(${target} ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${LIBS})
+  endif()
+
+  add_test(tester tester)
+
+ENDFOREACH()
+
+
+# Install
+# see http://stackoverflow.com/questions/14084759/keep-a-single-files-permissions-when-using-install-in-cmake
+####set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/deploy")
+####install(FILES build/lib/libtools_static.a DESTINATION lib)
+####install(PROGRAMS build/lib/libtools_shared.so DESTINATION lib)
+####install(PROGRAMS build/bin/hello DESTINATION bin)
+
+# 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)
+