]> git.mxchange.org Git - simgear.git/blob - CMakeLists.txt
b34f01742edd6c8764f73d9f8cdd4e698af73fb2
[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 if (NOT MSVC)
72 option(SIMGEAR_SHARED   "Set to ON to build SimGear as a shared library/framework" OFF)
73 option(SYSTEM_EXPAT     "Set to ON to build SimGear using the system libExpat" OFF)
74 else()
75 # Building SimGear DLLs is currently not supported for MSVC.
76 set(SIMGEAR_SHARED OFF)
77 # Using a system expat is currently not supported for MSVC - it would require shared simgear (DLL).
78 set(SYSTEM_EXPAT OFF)
79 endif()
80
81 option(SIMGEAR_HEADLESS "Set to ON to build SimGear without GUI/graphics support" OFF)
82 option(JPEG_FACTORY     "Enable JPEG-factory support" OFF)
83 option(ENABLE_LIBSVN    "Set to ON to build SimGear with libsvnclient support" ON)
84 option(ENABLE_RTI       "Set to ON to build SimGear with RTI support" OFF)
85 option(ENABLE_TESTS     "Set to OFF to disable building SimGear's test applications" ON)
86 option(ENABLE_SOUND     "Set to OFF to disable building SimGear's sound support" ON)
87
88 if (MSVC)
89   GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} PATH)
90   if (CMAKE_CL_64)
91     SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
92   else (CMAKE_CL_64)
93     SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty")
94   endif (CMAKE_CL_64)
95   if (EXISTS ${TEST_3RDPARTY_DIR})
96     set(MSVC_3RDPARTY_ROOT ${PARENT_DIR} CACHE PATH "Location where the third-party dependencies are extracted")
97   else (EXISTS ${TEST_3RDPARTY_DIR})
98     set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
99   endif (EXISTS ${TEST_3RDPARTY_DIR})
100 else (MSVC)
101   set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
102 endif (MSVC)
103
104 if (MSVC AND MSVC_3RDPARTY_ROOT)
105   message(STATUS "3rdparty files located in ${MSVC_3RDPARTY_ROOT}")
106   set( OSG_MSVC "msvc" )
107   if (${MSVC_VERSION} EQUAL 1700)
108       set( OSG_MSVC ${OSG_MSVC}110 )
109   elseif (${MSVC_VERSION} EQUAL 1600)
110       set( OSG_MSVC ${OSG_MSVC}100 )
111   else (${MSVC_VERSION} EQUAL 1700)
112       set( OSG_MSVC ${OSG_MSVC}90 )
113   endif (${MSVC_VERSION} EQUAL 1700)
114   if (CMAKE_CL_64)
115       set( OSG_MSVC ${OSG_MSVC}-64 )
116       set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
117   else (CMAKE_CL_64)
118       set( MSVC_3RDPARTY_DIR 3rdParty )
119   endif (CMAKE_CL_64)
120
121   set (CMAKE_LIBRARY_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/lib ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenRTI/lib )
122   set (CMAKE_INCLUDE_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/include ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenRTI/include)
123   find_path(BOOST_ROOT boost/version.hpp
124                         ${MSVC_3RDPARTY_ROOT}/boost
125                         ${MSVC_3RDPARTY_ROOT}/boost_1_52_0
126                         ${MSVC_3RDPARTY_ROOT}/boost_1_51_0
127                         ${MSVC_3RDPARTY_ROOT}/boost_1_50_0
128                         ${MSVC_3RDPARTY_ROOT}/boost_1_49_0
129                         ${MSVC_3RDPARTY_ROOT}/boost_1_48_0
130                         ${MSVC_3RDPARTY_ROOT}/boost_1_47_0
131                         ${MSVC_3RDPARTY_ROOT}/boost_1_46_1
132                         ${MSVC_3RDPARTY_ROOT}/boost_1_46_0
133                         ${MSVC_3RDPARTY_ROOT}/boost_1_45_0
134                         ${MSVC_3RDPARTY_ROOT}/boost_1_44_0
135                         )
136   # set (BOOST_ROOT ${MSVC_3RDPARTY_ROOT}/boost_1_44_0)
137   message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
138   set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
139   set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
140 endif (MSVC AND MSVC_3RDPARTY_ROOT)
141
142 find_package(Boost REQUIRED)
143 set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
144
145 if(SIMGEAR_HEADLESS)
146     message(STATUS "SimGear mode: HEADLESS")
147     set(ENABLE_SOUND 0)
148 else()
149     message(STATUS "SimGear mode: NORMAL")
150     find_package(OpenGL REQUIRED)
151     
152     if (ENABLE_SOUND)
153         find_package(OpenAL REQUIRED)
154     endif(ENABLE_SOUND)
155     
156     find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgGA osgUtil)
157 endif(SIMGEAR_HEADLESS)
158
159 if(JPEG_FACTORY)
160     message(STATUS "JPEG-factory: ENABLED")
161     find_package(JPEG REQUIRED)
162     include_directories(${JPEG_INCLUDE_DIR})
163 else()
164     message(STATUS "JPEG-factory: DISABLED")
165 endif(JPEG_FACTORY)
166
167 if(ENABLE_LIBSVN)
168     find_package(SvnClient)
169
170     if(LIBSVN_FOUND)
171         message(STATUS "Subversion client support: ENABLED")
172         set(HAVE_SVN_CLIENT_H 1)
173         set(HAVE_LIBSVN_CLIENT_1 1)
174     else()
175         # Oops. ENABLE_LIBSVN is ON, but svn is still missing.
176         # Provide clearly visible warning/hint, so builders know what else they should install (or disable).
177         message(WARNING "Failed to enable subversion client support. Unable to find required subversion client library. Some features may not be available (scenery download).")
178         message(WARNING "Install 'libsvn' library/DLL (libsvn-devel/libsvnclient/...). Otherwise disable subversion support (set 'ENABLE_LIBSVN' to 'OFF').")
179     endif(LIBSVN_FOUND)
180 else()
181     message(STATUS "Subversion client support: DISABLED")
182 endif(ENABLE_LIBSVN)
183
184 find_package(ZLIB REQUIRED)
185 find_package(Threads REQUIRED)
186
187 if (SYSTEM_EXPAT)
188     message(STATUS "Requested to use system Expat library, forcing SIMGEAR_SHARED to true")
189     set(SIMGEAR_SHARED ON)
190     find_package(EXPAT REQUIRED)
191     include_directories(${EXPAT_INCLUDE_DIRS})
192 else()
193     message(STATUS "Using built-in expat code")
194     add_definitions(-DHAVE_EXPAT_CONFIG_H)
195 endif(SYSTEM_EXPAT)
196
197 check_include_file(inttypes.h HAVE_INTTYPES_H)
198 check_include_file(sys/time.h HAVE_SYS_TIME_H)
199 check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
200 check_include_file(unistd.h HAVE_UNISTD_H)
201 check_include_file(windows.h HAVE_WINDOWS_H)
202
203 if(HAVE_INTTYPES_H)
204   # ShivaVG needs inttypes.h
205   add_definitions(-DHAVE_INTTYPES_H)
206 endif()
207
208 if(ENABLE_RTI)
209     # See if we have any rti library variant installed
210     message(STATUS "RTI: ENABLED")
211     find_package(RTI)
212 else()
213     message(STATUS "RTI: DISABLED")
214 endif(ENABLE_RTI)
215
216 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
217 check_function_exists(ftime HAVE_FTIME)
218 check_function_exists(timegm HAVE_TIMEGM)
219 check_function_exists(rint HAVE_RINT)
220 check_function_exists(mkdtemp HAVE_MKDTEMP)
221 check_function_exists(bcopy HAVE_BCOPY)
222 check_function_exists(mmap HAVE_MMAP)
223
224 if(HAVE_UNISTD_H)
225     set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
226     check_cxx_source_compiles(
227        "#include <unistd.h>
228         #if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
229             #error clock_gettime is not supported
230         #endif
231
232         int main() { return 0; }
233         "
234         HAVE_CLOCK_GETTIME)
235 endif(HAVE_UNISTD_H)
236
237 set(RT_LIBRARY "")
238 if(HAVE_CLOCK_GETTIME)
239     check_library_exists(rt clock_gettime "" HAVE_RT)
240     if(HAVE_RT)
241         set(RT_LIBRARY rt)
242     endif(HAVE_RT)
243 endif(HAVE_CLOCK_GETTIME)
244
245 SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
246 SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
247 SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
248 SET(CMAKE_MINSIZEREL_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
249
250 # isnan might not be real symbol, so can't check using function_exists
251 check_cxx_source_compiles(
252     "#include <cmath> 
253     void f() { isnan(0.0);} "
254     HAVE_ISNAN)
255
256 check_cxx_source_compiles(
257     "#include <cmath> 
258     void f() { std::isnan(0.0);} "
259     HAVE_STD_ISNAN)
260
261 if(CMAKE_COMPILER_IS_GNUCXX)
262     set(WARNING_FLAGS_CXX "-Wall")
263     set(WARNING_FLAGS_C   "-Wall")
264
265     # certain GCC versions don't provide the atomic builds, and hence
266     # require is to provide them in SGAtomic.cxx
267     set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
268     check_cxx_source_compiles(
269        "int main() { unsigned mValue; return __sync_add_and_fetch(&mValue, 1); }"
270         GCC_ATOMIC_BUILTINS_FOUND)
271 endif(CMAKE_COMPILER_IS_GNUCXX)
272
273 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
274    set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
275    set(WARNING_FLAGS_C   "-Wall")
276 endif()
277
278 if(WIN32)
279
280     if(MINGW)
281         add_definitions(-D_WIN32_WINNT=0x501)
282     endif()
283
284     if(MSVC)
285         # turn off various warnings
286         # foreach(warning 4244 4251 4267 4275 4290 4786 4305 4996)
287         #     SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
288         # endforeach(warning)
289         
290         set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996 /wd4250")
291     endif(MSVC)
292     
293     # assumed on Windows
294     set(HAVE_GETLOCALTIME 1)
295     
296     set( WINSOCK_LIBRARY "ws2_32.lib" )
297     set( RT_LIBRARY "winmm" )
298 endif(WIN32)
299
300 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
301 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
302
303 include_directories(${PROJECT_SOURCE_DIR})
304 include_directories(${PROJECT_SOURCE_DIR}/simgear/canvas/ShivaVG/include)
305 include_directories(${PROJECT_BINARY_DIR}/simgear)
306 include_directories(${PROJECT_BINARY_DIR}/simgear/xml)
307
308 include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS} 
309     ${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR} 
310     ${OPENAL_INCLUDE_DIR} )
311
312 add_definitions(-DHAVE_CONFIG_H)
313
314 # configure a header file to pass some of the CMake settings
315 # to the source code
316 configure_file (
317   "${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
318   "${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
319   )
320
321 configure_file (
322     "${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
323     "${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
324 )
325
326 if(ENABLE_TESTS)
327     # enable CTest / make test target
328     message(STATUS "Tests: ENABLED")
329
330     include (Dart)
331         enable_testing()
332 else()
333     message(STATUS "Tests: DISABLED")
334 endif(ENABLE_TESTS)
335
336 install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h  DESTINATION include/simgear/)
337 add_subdirectory(simgear)
338
339 #-----------------------------------------------------------------------------
340 ### uninstall target
341 #-----------------------------------------------------------------------------
342 CONFIGURE_FILE(
343   "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in"
344   "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
345   IMMEDIATE @ONLY)
346 ADD_CUSTOM_TARGET(uninstall
347   "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")