dbce3e331c8a88fab9d904a8c27242811b7bc7f9
[anna.git] / CMakeLists.txt
1 # See more at: https://cmake.org/Wiki/CMake_Useful_Variables
2
3 # Stop if cmake version below 2.8
4 cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
5
6 # Project name
7 project(anna)
8
9 # Enable c++ language
10 enable_language(C CXX)
11
12 # Project version
13 set(VERSION_MAJOR 1)
14 set(VERSION_MINOR 0)
15 set(VERSION_PATCH 0)
16
17 # Build type:
18 if(NOT CMAKE_BUILD_TYPE)
19   message(WARNING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel.")
20   set(CMAKE_BUILD_TYPE "Release" CACHE STRING
21       "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
22 endif(NOT CMAKE_BUILD_TYPE)
23
24 # Build output directory:
25 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY build/${CMAKE_BUILD_TYPE}/bin)
26 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY build/${CMAKE_BUILD_TYPE}/lib)
27 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY build/${CMAKE_BUILD_TYPE}/lib)
28 message(STATUS "CMAKE_RUNTIME_OUTPUT_DIRECTORY is ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
29 message(STATUS "CMAKE_LIBRARY_OUTPUT_DIRECTORY is ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
30 message(STATUS "CMAKE_ARCHIVE_OUTPUT_DIRECTORY is ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}")
31
32 # http://stackoverflow.com/questions/6594796/how-do-i-make-cmake-output-into-a-bin-dir
33 #set_target_properties( targets...
34 #    PROPERTIES
35 #    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
36 #    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
37 #    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
38 #)
39
40 # Location of additional cmake modules
41 set(CMAKE_MODULE_PATH
42     ${CMAKE_MODULE_PATH}
43     ${CMAKE_CURRENT_SOURCE_DIR}/cmake
44     )
45
46 # Detect operating system
47 message(STATUS "This is a ${CMAKE_SYSTEM_NAME} system")
48 if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
49     add_definitions(-DSYSTEM_LINUX)
50 endif()
51 if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
52     add_definitions(-DSYSTEM_DARWIN)
53 endif()
54 if(${CMAKE_SYSTEM_NAME} STREQUAL "AIX")
55     add_definitions(-DSYSTEM_AIX)
56 endif()
57
58 # Detect host processor
59 message(STATUS "The host processor is ${CMAKE_HOST_SYSTEM_PROCESSOR}")
60 message(STATUS "The c compiler is ${CMAKE_C_COMPILER}")
61 message(STATUS "The c++ compiler is ${CMAKE_CXX_COMPILER}")
62 message(STATUS "The build type is ${CMAKE_BUILD_TYPE}")
63
64 # Example how to set c++ compiler flags for GNU
65 if(CMAKE_CXX_COMPILER_ID MATCHES GNU)
66     #execute_process(COMMAND g++ --version >/dev/null 2>/dev/null)
67     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wno-unknown-pragmas -Wno-sign-compare -Woverloaded-virtual -Wwrite-strings -Wno-unused")
68     set(CMAKE_CXX_FLAGS_DEBUG   "-O0 -g3")
69     set(CMAKE_CXX_FLAGS_RELEASE "-O3")
70
71 elseif(CMAKE_CXX_COMPILER_ID MATCHES Clang)
72     #execute_process(COMMAND clang++ --version >/dev/null 2>/dev/null)
73     add_definitions(-DIS_CLANG)
74     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")
75     set(CMAKE_CXX_FLAGS_DEBUG   "-O0 -g3")
76     set(CMAKE_CXX_FLAGS_RELEASE "-O3")
77 endif()
78
79
80 if (CMAKE_BUILD_TYPE STREQUAL Debug)
81     set(BUILD_POSTFIX "_d")
82 else(CMAKE_BUILD_TYPE STREQUAL Debug)
83     set(BUILD_POSTFIX "")
84 endif(CMAKE_BUILD_TYPE STREQUAL Debug)
85
86
87 # Macro to get children directories:
88 MACRO(SUBDIRLIST result curdir)
89   FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)
90   SET(dirlist "")
91   FOREACH(child ${children})
92     IF(IS_DIRECTORY ${curdir}/${child})
93       LIST(APPEND dirlist ${child})
94     ENDIF()
95   ENDFOREACH()
96   SET(${result} ${dirlist})
97 ENDMACRO()
98
99 # Definitions (any way to apply only at ldap context ?):
100 add_definitions(-DLDAP_DEPRECATED)
101
102 # General includes:
103 include_directories(include/anna)
104 include_directories(/usr/include/libxml2)
105 include_directories(/usr/lib/oracle/12.1/client64/include)
106
107 # <source>
108 SUBDIRLIST(SUBDIRS ${CMAKE_CURRENT_SOURCE_DIR}/source)
109 FOREACH(subdir ${SUBDIRS})
110   message(STATUS "Processing library at: source/${subdir}")
111   file(GLOB_RECURSE SRCS source/${subdir}/*.cpp)
112   add_library(${subdir}_static STATIC ${SRCS})
113   add_library(${subdir}_shared SHARED ${SRCS})
114 ENDFOREACH()
115
116 # <dynamic>
117 file(GLOB_RECURSE DYNAMIC_PROCEDURES ${CMAKE_CURRENT_SOURCE_DIR}/dynamic/launcher/*.cpp)
118 FOREACH(procedure ${DYNAMIC_PROCEDURES})
119   get_filename_component(dirname ${procedure} DIRECTORY)
120   file(RELATIVE_PATH rel ${CMAKE_CURRENT_SOURCE_DIR}/dynamic/launcher ${dirname})
121   # convert "/" to "_"
122   string(REGEX REPLACE "/" "_" libpath ${rel})
123
124   message(STATUS "Processing dynamic library at: dynamic/launcher/${rel}")
125   file(GLOB_RECURSE SRCS dynamic/launcher/${rel}/*.cpp)
126   add_library(launcher_procedure_${libpath}_shared SHARED ${SRCS})
127   set(target_dirname build/${CMAKE_BUILD_TYPE}/lib/dynamic_launcher/${libpath})
128   set(target_basename launcher_procedure_${libpath}_shared)
129   set_target_properties(${target_basename} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${target_dirname})
130   #file(RENAME ${target_dirname}/lib${target_basename}.so ${target_dirname}/libprocedure.so)
131 ENDFOREACH()
132
133 # Linking example:
134 #file(GLOB_RECURSE SRCS ${CMAKE_CURRENT_SOURCE_DIR}/example/core/genLogon/*.cpp)
135 #add_executable(genLogon ${SRCS})
136 #target_link_libraries(genLogon core_static app_static core_static test_static xml_static io_static crypto xml2 rt)
137
138 # Generalization:
139 # <example>
140 SUBDIRLIST(MODULES ${CMAKE_CURRENT_SOURCE_DIR}/example)
141 FOREACH(module ${MODULES})
142   SUBDIRLIST(SUBDIRS ${CMAKE_CURRENT_SOURCE_DIR}/example/${module})
143   FOREACH(subdir ${SUBDIRS})
144     message(STATUS "Processing executable at: example/${module}/${subdir}")
145
146     # Sources
147     file(GLOB_RECURSE SRCS ${CMAKE_CURRENT_SOURCE_DIR}/example/${module}/${subdir}/*.cpp)
148
149     # Executable
150     set(target "${module}_${subdir}")
151     add_executable(${target} "${SRCS}")
152     set_target_properties(${target} PROPERTIES LINKER_LANGUAGE CXX)
153     set(libraries_file "${CMAKE_CURRENT_SOURCE_DIR}/example/${module}/${subdir}/libraries.txt")
154     set(includes_file "${CMAKE_CURRENT_SOURCE_DIR}/example/${module}/${subdir}/includes.txt")
155
156     if(EXISTS "${includes_file}")
157       file (STRINGS "${includes_file}" HDRS)
158       # Include own example directory:
159       target_include_directories(${target} PUBLIC
160         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/example/${module}/${subdir}>
161       )
162       FOREACH(HDR ${HDRS})
163         #message(STATUS "Header directory: ${HDR}")
164         target_include_directories(${target} PUBLIC
165           $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${HDR}>
166         )
167       ENDFOREACH()
168     endif()
169
170     if(EXISTS "${libraries_file}")
171       file (STRINGS "${libraries_file}" LIBS)
172       #message(STATUS "Libraries: ${LIBS}")
173       target_link_libraries(${target} ${LIBS})
174     endif()
175
176   ENDFOREACH()
177 ENDFOREACH()
178
179
180 # <test>
181 enable_testing()
182 find_package(GTest REQUIRED)
183 include_directories(${GTEST_INCLUDE_DIRS})
184
185 SUBDIRLIST(MODULES ${CMAKE_CURRENT_SOURCE_DIR}/test)
186 FOREACH(module ${MODULES})
187
188   message(STATUS "Processing basic test at: test/${module}")
189
190   # Sources
191   file(GLOB_RECURSE SRCS ${CMAKE_CURRENT_SOURCE_DIR}/test/${module}/*.cpp)
192
193   # Executable
194   set(target "test_${module}")
195   add_executable(${target} "${SRCS}")
196   target_link_libraries(${target} ${GTEST_BOTH_LIBRARIES} pthread)
197   set(libraries_file "${CMAKE_CURRENT_SOURCE_DIR}/test/${module}/libraries.txt")
198
199   if(EXISTS "${libraries_file}")
200     file (STRINGS "${libraries_file}" LIBS)
201     #message(STATUS "Libraries: ${LIBS}")
202     target_link_libraries(${target} ${GTEST_BOTH_LIBRARIES} pthread ${LIBS})
203   endif()
204
205   add_test(${target} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${target})
206
207 ENDFOREACH()
208
209
210 # Install
211 # see http://stackoverflow.com/questions/14084759/keep-a-single-files-permissions-when-using-install-in-cmake
212 ####set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/deploy")
213 ####install(FILES build/lib/libtools_static.a DESTINATION lib)
214 ####install(PROGRAMS build/lib/libtools_shared.so DESTINATION lib)
215 ####install(PROGRAMS build/bin/hello DESTINATION bin)
216
217 # Add target for API documentation with Doxygen
218 find_package(Doxygen)
219 if(DOXYGEN_FOUND)
220 add_custom_target(doc
221   ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/docs/doxygen/Doxyfile
222   WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docs/doxygen
223   COMMENT "Generating API documentation with Doxygen" VERBATIM
224 )
225 endif(DOXYGEN_FOUND)
226