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