+# 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)
+