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