]> git.mxchange.org Git - simgear.git/blob - CMakeLists.txt
Merge branch 'timoore/optimizations' into next
[simgear.git] / CMakeLists.txt
1 cmake_minimum_required (VERSION 2.6.4)
2 include (CheckFunctionExists)
3 include (CheckIncludeFile)
4 include (CheckCXXSourceCompiles)
5
6
7 project(SimGear)
8
9 # read 'version' file into a variable (stripping any newlines or spaces)
10 file(READ version versionFile)
11 string(STRIP ${versionFile} SIMGEAR_VERSION)
12
13 # use simgear version also as the SO version (if building SOs)
14 SET(SIMGEAR_SOVERSION ${SIMGEAR_VERSION})
15
16 # Warning when build is not an out-of-source build.
17 string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" InSourceBuild)
18 if(InSourceBuild)
19     message(WARNING  "Avoid building inside the source tree!")
20     message(WARNING  "Create a separate build directory instead (i.e. 'sgbuild') and call CMake from there: ")
21     message(WARNING  "  mkdir ../sgbuild && cd ../sgbuild && cmake ${CMAKE_SOURCE_DIR}")
22 endif(InSourceBuild)
23
24 #packaging
25 SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/COPYING")
26 SET(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README")
27 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Simulation support libraries for FlightGear and related projects")
28 SET(CPACK_PACKAGE_VENDOR "The FlightGear project")
29 SET(CPACK_GENERATOR "TBZ2")
30 SET(CPACK_INSTALL_CMAKE_PROJECTS  ${CMAKE_CURRENT_BINARY_DIR};SimGear;ALL;/)
31
32
33 # split version string into components, note CMAKE_MATCH_0 is the entire regexp match
34 string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" CPACK_PACKAGE_VERSION ${SIMGEAR_VERSION} )
35 set(CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_MATCH_1}) 
36 set(CPACK_PACKAGE_VERSION_MINOR ${CMAKE_MATCH_2})
37 set(CPACK_PACKAGE_VERSION_PATCH ${CMAKE_MATCH_3})
38
39 message(STATUS "version is ${CPACK_PACKAGE_VERSION_MAJOR} dot ${CPACK_PACKAGE_VERSION_MINOR} dot ${CPACK_PACKAGE_VERSION_PATCH}")
40
41 set(CPACK_SOURCE_GENERATOR TBZ2)
42 set(CPACK_SOURCE_PACKAGE_FILE_NAME "simgear-${SIMGEAR_VERSION}" CACHE INTERNAL "tarball basename")
43 set(CPACK_SOURCE_IGNORE_FILES
44   "^${PROJECT_SOURCE_DIR}/.git;\\\\.gitignore;Makefile.am;~$;${CPACK_SOURCE_IGNORE_FILES}")
45
46 message(STATUS "ignoring: ${CPACK_SOURCE_IGNORE_FILES}")
47
48 include (CPack)
49
50 # We have some custom .cmake scripts not in the official distribution.
51 set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/CMakeModules;${CMAKE_MODULE_PATH}")
52
53 # Change the default build type to something fast
54 if(NOT CMAKE_BUILD_TYPE)
55   set(CMAKE_BUILD_TYPE Release CACHE STRING
56       "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
57       FORCE)
58 endif(NOT CMAKE_BUILD_TYPE)
59
60 # Determine name of library installation directory, i.e. "lib" vs "lib64", which
61 # differs between all Debian-based vs all other Linux distros.
62 # See cmake bug #11964, http://cmake.org/gitweb?p=cmake.git;a=commit;h=126c993d
63 # GNUInstallDirs requires CMake >= 2.8.5, use own file for older cmake
64 if(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
65   include(GNUInstallDirs)
66 else(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
67   include(OldGNUInstallDirs)
68 endif(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
69 message(STATUS "Library installation directory: ${CMAKE_INSTALL_LIBDIR}")
70
71 option(SIMGEAR_SHARED   "Set to ON to build SimGear as a shared library/framework" OFF)
72 option(SIMGEAR_HEADLESS "Set to ON to build SimGear without GUI/graphics support" OFF)
73 option(JPEG_FACTORY     "Enable JPEG-factory support" OFF)
74 option(ENABLE_LIBSVN    "Set to ON to build SimGear with libsvnclient support" ON)
75 option(ENABLE_RTI       "Set to ON to build SimGear with RTI support" OFF)
76 option(ENABLE_TESTS     "Set to OFF to disable building SimGear's test applications" ON)
77
78 if (MSVC)
79   GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} PATH)
80   if (CMAKE_CL_64)
81     SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
82   else (CMAKE_CL_64)
83     SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty")
84   endif (CMAKE_CL_64)
85   if (EXISTS ${TEST_3RDPARTY_DIR})
86     set(MSVC_3RDPARTY_ROOT ${PARENT_DIR} CACHE PATH "Location where the third-party dependencies are extracted")
87   else (EXISTS ${TEST_3RDPARTY_DIR})
88     set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
89   endif (EXISTS ${TEST_3RDPARTY_DIR})
90 else (MSVC)
91   set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
92 endif (MSVC)
93
94 if (MSVC AND MSVC_3RDPARTY_ROOT)
95   message(STATUS "3rdparty files located in ${MSVC_3RDPARTY_ROOT}")
96   set( OSG_MSVC "msvc" )
97   if (${MSVC_VERSION} EQUAL 1600)
98       set( OSG_MSVC ${OSG_MSVC}100 )
99   else (${MSVC_VERSION} EQUAL 1600)
100       set( OSG_MSVC ${OSG_MSVC}90 )
101   endif (${MSVC_VERSION} EQUAL 1600)
102   if (CMAKE_CL_64)
103       set( OSG_MSVC ${OSG_MSVC}-64 )
104       set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
105   else (CMAKE_CL_64)
106       set( MSVC_3RDPARTY_DIR 3rdParty )
107   endif (CMAKE_CL_64)
108
109   set (CMAKE_LIBRARY_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/lib )
110   set (CMAKE_INCLUDE_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/include)
111   set (BOOST_ROOT ${MSVC_3RDPARTY_ROOT}/boost_1_44_0)
112   message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
113   set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
114   set (ALUT_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
115   set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
116 endif (MSVC AND MSVC_3RDPARTY_ROOT)
117
118 find_package(Boost REQUIRED)
119 set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
120
121 find_package(ZLIB REQUIRED)
122 find_package(Threads REQUIRED)
123
124 if(SIMGEAR_HEADLESS)
125     message(STATUS "SimGear mode: HEADLESS")
126 else()
127     message(STATUS "SimGear mode: NORMAL")
128     find_package(OpenGL REQUIRED)
129     find_package(OpenAL REQUIRED)
130     find_package(ALUT REQUIRED)
131     find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgUtil)
132 endif(SIMGEAR_HEADLESS)
133
134 if(JPEG_FACTORY)
135     message(STATUS "JPEG-factory: ENABLED")
136     find_package(JPEG REQUIRED)
137     include_directories(${JPEG_INCLUDE_DIR})
138 else()
139     message(STATUS "JPEG-factory: DISABLED")
140 endif(JPEG_FACTORY)
141
142 if(ENABLE_LIBSVN)
143     find_package(SvnClient)
144
145     if(LIBSVN_FOUND)
146         message(STATUS "Subversion client support: ENABLED")
147         set(HAVE_SVN_CLIENT_H 1)
148         set(HAVE_LIBSVN_CLIENT_1 1)
149     else()
150         # Oops. ENABLE_LIBSVN is ON, but svn is still missing.
151         # Provide clearly visible warning/hint, so builders know what else they should install (or disable).
152         message(WARNING "Failed to enable subversion client support. Unable to find required subversion client library. Some features may not be available (scenery download).")
153         message(WARNING "Install 'libsvn' library/DLL (libsvn-devel/libsvnclient/...). Otherwise disable subversion support (set 'ENABLE_LIBSVN' to 'OFF').")
154     endif(LIBSVN_FOUND)
155 else()
156     message(STATUS "Subversion client support: DISABLED")
157 endif(ENABLE_LIBSVN)
158
159 check_include_file(sys/time.h HAVE_SYS_TIME_H)
160 check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
161 check_include_file(unistd.h HAVE_UNISTD_H)
162 check_include_file(windows.h HAVE_WINDOWS_H)
163
164 if(ENABLE_RTI)
165     # See if we have any rti library variant installed
166     message(STATUS "RTI: ENABLED")
167     find_package(RTI)
168 else()
169     message(STATUS "RTI: DISABLED")
170 endif(ENABLE_RTI)
171
172 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
173 check_function_exists(ftime HAVE_FTIME)
174 check_function_exists(timegm HAVE_TIMEGM)
175 check_function_exists(rint HAVE_RINT)
176 check_function_exists(mkdtemp HAVE_MKDTEMP)
177 check_function_exists(bcopy HAVE_BCOPY)
178 check_function_exists(mmap HAVE_MMAP)
179
180 if(HAVE_UNISTD_H)
181     set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
182     check_cxx_source_compiles(
183        "#include <unistd.h>
184         #if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
185             #error clock_gettime is not supported
186         #endif
187
188         int main() { return 0; }
189         "
190         HAVE_CLOCK_GETTIME)
191 endif(HAVE_UNISTD_H)
192
193 set(RT_LIBRARY "")
194 if(HAVE_CLOCK_GETTIME)
195     check_library_exists(rt clock_gettime "" HAVE_RT)
196     if(HAVE_RT)
197         set(RT_LIBRARY rt)
198     endif(HAVE_RT)
199 endif(HAVE_CLOCK_GETTIME)
200
201 SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
202 SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
203 SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
204 SET(CMAKE_MINSIZEREL_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
205
206 # isnan might not be real symbol, so can't check using function_exists
207 check_cxx_source_compiles(
208     "#include <cmath> 
209     void f() { isnan(0.0);} "
210     HAVE_ISNAN)
211
212 if(CMAKE_COMPILER_IS_GNUCXX)
213     set(WARNING_FLAGS_CXX "-Wall")
214     set(WARNING_FLAGS_C   "-Wall")
215
216     # certain GCC versions don't provide the atomic builds, and hence
217     # require is to provide them in SGAtomic.cxx
218     set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
219     check_cxx_source_compiles(
220        "int main() { unsigned mValue; return __sync_add_and_fetch(&mValue, 1); }"
221         GCC_ATOMIC_BUILTINS_FOUND)
222 endif(CMAKE_COMPILER_IS_GNUCXX)
223
224 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
225    set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
226    set(WARNING_FLAGS_C   "-Wall")
227 endif()
228
229 if(WIN32)
230
231     if(MINGW)
232         add_definitions(-D_WIN32_WINNT=0x501)
233     endif()
234
235     if(MSVC)
236         # turn off various warnings
237         # foreach(warning 4244 4251 4267 4275 4290 4786 4305 4996)
238         #     SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
239         # endforeach(warning)
240         
241         set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996")
242     endif(MSVC)
243     
244     # assumed on Windows
245     set(HAVE_GETLOCALTIME 1)
246     
247     set( WINSOCK_LIBRARY "ws2_32.lib" )
248     set( RT_LIBRARY "winmm" )
249 endif(WIN32)
250
251 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
252 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
253
254 include_directories(${PROJECT_SOURCE_DIR})
255 include_directories(${PROJECT_BINARY_DIR}/simgear)
256 include_directories(${PROJECT_BINARY_DIR}/simgear/xml)
257
258 include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS} 
259     ${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR} 
260     ${ALUT_INCLUDE_DIR} ${OPENAL_INCLUDE_DIR} )
261
262 add_definitions(-DHAVE_CONFIG_H)
263 add_definitions(-DHAVE_EXPAT_CONFIG_H)
264
265 # configure a header file to pass some of the CMake settings
266 # to the source code
267 configure_file (
268   "${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
269   "${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
270   )
271
272 configure_file (
273     "${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
274     "${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
275 )
276
277 if(ENABLE_TESTS)
278     # enable CTest / make test target
279     message(STATUS "Tests: ENABLED")
280
281     include (Dart)
282         enable_testing()
283 else()
284     message(STATUS "Tests: DISABLED")
285 endif(ENABLE_TESTS)
286
287 install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h  DESTINATION include/simgear/)
288 add_subdirectory(simgear)
289
290 #-----------------------------------------------------------------------------
291 ### uninstall target
292 #-----------------------------------------------------------------------------
293 CONFIGURE_FILE(
294   "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in"
295   "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
296   IMMEDIATE @ONLY)
297 ADD_CUSTOM_TARGET(uninstall
298   "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")