1 cmake_minimum_required (VERSION 2.6.4)
2 include (CheckFunctionExists)
3 include (CheckIncludeFile)
4 include (CheckCXXSourceCompiles)
9 # read 'version' file into a variable (stripping any newlines or spaces)
10 file(READ version versionFile)
11 string(STRIP ${versionFile} SIMGEAR_VERSION)
13 set(FIND_LIBRARY_USE_LIB64_PATHS ON)
15 # use simgear version also as the SO version (if building SOs)
16 SET(SIMGEAR_SOVERSION ${SIMGEAR_VERSION})
18 # Warning when build is not an out-of-source build.
19 string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" InSourceBuild)
21 message(WARNING "Avoid building inside the source tree!")
22 message(WARNING "Create a separate build directory instead (i.e. 'sgbuild') and call CMake from there: ")
23 message(WARNING " mkdir ../sgbuild && cd ../sgbuild && cmake ${CMAKE_SOURCE_DIR}")
26 if (NOT EMBEDDED_SIMGEAR)
28 SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/COPYING")
29 SET(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README")
30 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Simulation support libraries for FlightGear and related projects")
31 SET(CPACK_PACKAGE_VENDOR "The FlightGear project")
32 SET(CPACK_GENERATOR "TBZ2")
33 SET(CPACK_INSTALL_CMAKE_PROJECTS ${CMAKE_CURRENT_BINARY_DIR};SimGear;ALL;/)
36 # split version string into components, note CMAKE_MATCH_0 is the entire regexp match
37 string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" CPACK_PACKAGE_VERSION ${SIMGEAR_VERSION} )
38 set(CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_MATCH_1})
39 set(CPACK_PACKAGE_VERSION_MINOR ${CMAKE_MATCH_2})
40 set(CPACK_PACKAGE_VERSION_PATCH ${CMAKE_MATCH_3})
42 message(STATUS "version is ${CPACK_PACKAGE_VERSION_MAJOR} dot ${CPACK_PACKAGE_VERSION_MINOR} dot ${CPACK_PACKAGE_VERSION_PATCH}")
44 set(CPACK_SOURCE_GENERATOR TBZ2)
45 set(CPACK_SOURCE_PACKAGE_FILE_NAME "simgear-${SIMGEAR_VERSION}" CACHE INTERNAL "tarball basename")
46 set(CPACK_SOURCE_IGNORE_FILES
47 "^${PROJECT_SOURCE_DIR}/.git;\\\\.gitignore;Makefile.am;~$;${CPACK_SOURCE_IGNORE_FILES}")
49 message(STATUS "ignoring: ${CPACK_SOURCE_IGNORE_FILES}")
54 # We have some custom .cmake scripts not in the official distribution.
55 set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/CMakeModules;${CMAKE_MODULE_PATH}")
57 # Change the default build type to something fast
58 if(NOT CMAKE_BUILD_TYPE)
59 set(CMAKE_BUILD_TYPE Release CACHE STRING
60 "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
62 endif(NOT CMAKE_BUILD_TYPE)
64 # Determine name of library installation directory, i.e. "lib" vs "lib64", which
65 # differs between all Debian-based vs all other Linux distros.
66 # See cmake bug #11964, http://cmake.org/gitweb?p=cmake.git;a=commit;h=126c993d
67 # GNUInstallDirs requires CMake >= 2.8.5, use own file for older cmake
68 if(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
69 include(GNUInstallDirs)
70 else(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
71 include(OldGNUInstallDirs)
72 endif(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
73 message(STATUS "Library installation directory: ${CMAKE_INSTALL_LIBDIR}")
75 #####################################################################################
76 # Configure library search paths
77 #####################################################################################
79 if(NOT "${CMAKE_LIBRARY_ARCHITECTURE}" STREQUAL "")
80 # Workaround for Ubuntu/Debian which introduced the "multiarch" library
81 # directory structure, which is unsupported by CMake < 2.8.10, so we need to
83 # see http://www.cmake.org/Bug/view.php?id=12049 and
84 # http://www.cmake.org/Bug/view.php?id=12037
85 list(APPEND ADDITIONAL_LIBRARY_PATHS
86 /usr/local/lib/${CMAKE_LIBRARY_ARCHITECTURE}
87 /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}
88 /lib/${CMAKE_LIBRARY_ARCHITECTURE})
89 message(STATUS "additional library directories: ${ADDITIONAL_LIBRARY_PATHS}")
93 # TBD: are these really necessary? Aren't they considered by cmake automatically?
94 list(APPEND ADDITIONAL_LIBRARY_PATHS
99 #####################################################################################
102 option(SIMGEAR_SHARED "Set to ON to build SimGear as a shared library/framework" OFF)
103 option(SYSTEM_EXPAT "Set to ON to build SimGear using the system libExpat" OFF)
105 # Building SimGear DLLs is currently not supported for MSVC.
106 set(SIMGEAR_SHARED OFF)
107 # Using a system expat is currently not supported for MSVC - it would require shared simgear (DLL).
108 set(SYSTEM_EXPAT OFF)
111 option(SIMGEAR_HEADLESS "Set to ON to build SimGear without GUI/graphics support" OFF)
112 option(JPEG_FACTORY "Enable JPEG-factory support" OFF)
113 option(SG_SVN_CLIENT "Set to ON to build SimGear with built-in SVN support" OFF)
114 option(ENABLE_LIBSVN "Set to ON to build SimGear with libsvnclient support" ON)
115 option(ENABLE_RTI "Set to ON to build SimGear with RTI support" OFF)
116 option(ENABLE_TESTS "Set to OFF to disable building SimGear's test applications" ON)
117 option(ENABLE_SOUND "Set to OFF to disable building SimGear's sound support" ON)
118 option(ENABLE_PKGUTIL "Set to ON to build the sg_pkgutil application (default)" ON)
121 GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_BINARY_DIR} PATH)
123 SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
125 SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty")
127 if (EXISTS ${TEST_3RDPARTY_DIR})
128 set(MSVC_3RDPARTY_ROOT ${PARENT_DIR} CACHE PATH "Location where the third-party dependencies are extracted")
129 else (EXISTS ${TEST_3RDPARTY_DIR})
130 set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
131 endif (EXISTS ${TEST_3RDPARTY_DIR})
133 set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
136 if (MSVC AND MSVC_3RDPARTY_ROOT)
137 message(STATUS "3rdparty files located in ${MSVC_3RDPARTY_ROOT}")
138 set( OSG_MSVC "msvc" )
139 if (${MSVC_VERSION} EQUAL 1700)
140 set( OSG_MSVC ${OSG_MSVC}110 )
141 elseif (${MSVC_VERSION} EQUAL 1600)
142 set( OSG_MSVC ${OSG_MSVC}100 )
143 else (${MSVC_VERSION} EQUAL 1700)
144 set( OSG_MSVC ${OSG_MSVC}90 )
145 endif (${MSVC_VERSION} EQUAL 1700)
147 set( OSG_MSVC ${OSG_MSVC}-64 )
148 set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
150 set( MSVC_3RDPARTY_DIR 3rdParty )
153 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 )
154 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)
155 find_path(BOOST_ROOT boost/version.hpp
156 ${MSVC_3RDPARTY_ROOT}/boost
157 ${MSVC_3RDPARTY_ROOT}/boost_1_52_0
158 ${MSVC_3RDPARTY_ROOT}/boost_1_51_0
159 ${MSVC_3RDPARTY_ROOT}/boost_1_50_0
160 ${MSVC_3RDPARTY_ROOT}/boost_1_49_0
161 ${MSVC_3RDPARTY_ROOT}/boost_1_48_0
162 ${MSVC_3RDPARTY_ROOT}/boost_1_47_0
163 ${MSVC_3RDPARTY_ROOT}/boost_1_46_1
164 ${MSVC_3RDPARTY_ROOT}/boost_1_46_0
165 ${MSVC_3RDPARTY_ROOT}/boost_1_45_0
166 ${MSVC_3RDPARTY_ROOT}/boost_1_44_0
168 # set (BOOST_ROOT ${MSVC_3RDPARTY_ROOT}/boost_1_44_0)
169 message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
170 set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
171 set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
172 endif (MSVC AND MSVC_3RDPARTY_ROOT)
175 find_library(CORE_SERVICES_LIBRARY CoreServices)
178 find_package(Boost REQUIRED)
179 set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
182 message(STATUS "SimGear mode: HEADLESS")
185 message(STATUS "SimGear mode: NORMAL")
186 find_package(OpenGL REQUIRED)
189 find_package(OpenAL REQUIRED)
190 message(STATUS "Sound support: ENABLED")
193 find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgGA osgUtil)
194 endif(SIMGEAR_HEADLESS)
197 message(STATUS "JPEG-factory: ENABLED")
198 find_package(JPEG REQUIRED)
199 include_directories(${JPEG_INCLUDE_DIR})
201 message(STATUS "JPEG-factory: DISABLED")
205 message(STATUS "Using built-in subversion client code")
206 elseif(ENABLE_LIBSVN)
207 find_package(SvnClient)
210 message(STATUS "Subversion client support: ENABLED")
211 set(HAVE_SVN_CLIENT_H 1)
212 set(HAVE_LIBSVN_CLIENT_1 1)
214 # Oops. ENABLE_LIBSVN is ON, but svn is still missing.
215 # Provide clearly visible warning/hint, so builders know what else they should install (or disable).
216 message(WARNING "Failed to enable subversion client support. Unable to find required subversion client library. Some features may not be available (scenery download).")
217 message(WARNING "Install 'libsvn' library/DLL (libsvn-devel/libsvnclient/...). Otherwise disable subversion support (set 'ENABLE_LIBSVN' to 'OFF').")
220 message(STATUS "Subversion client support: DISABLED")
223 find_package(ZLIB REQUIRED)
224 find_package(Threads REQUIRED)
227 message(STATUS "Requested to use system Expat library, forcing SIMGEAR_SHARED to true")
228 set(SIMGEAR_SHARED ON)
229 find_package(EXPAT REQUIRED)
232 message(STATUS "Using built-in expat code")
233 # XML_STATIC is important to avoid sg_expat_external.h
234 # declaring symbols as declspec(import)
235 add_definitions(-DHAVE_EXPAT_CONFIG_H -DXML_STATIC)
236 set(EXPAT_INCLUDE_DIRS
237 ${PROJECT_SOURCE_DIR}/3rdparty/expat
238 ${PROJECT_BINARY_DIR}/3rdparty/expat)
241 include_directories(${EXPAT_INCLUDE_DIRS})
243 check_include_file(inttypes.h HAVE_INTTYPES_H)
244 check_include_file(sys/time.h HAVE_SYS_TIME_H)
245 check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
246 check_include_file(unistd.h HAVE_UNISTD_H)
247 check_include_file(windows.h HAVE_WINDOWS_H)
250 # ShivaVG needs inttypes.h
251 add_definitions(-DHAVE_INTTYPES_H)
255 # See if we have any rti library variant installed
256 message(STATUS "RTI: ENABLED")
259 message(STATUS "RTI: DISABLED")
262 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
263 check_function_exists(ftime HAVE_FTIME)
264 check_function_exists(timegm HAVE_TIMEGM)
265 check_function_exists(rint HAVE_RINT)
266 check_function_exists(mkdtemp HAVE_MKDTEMP)
267 check_function_exists(bcopy HAVE_BCOPY)
268 check_function_exists(mmap HAVE_MMAP)
271 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
272 check_cxx_source_compiles(
274 #if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
275 #error clock_gettime is not supported
278 int main() { return 0; }
284 if(HAVE_CLOCK_GETTIME)
285 check_library_exists(rt clock_gettime "" HAVE_RT)
289 endif(HAVE_CLOCK_GETTIME)
291 SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
292 SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
293 SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
294 SET(CMAKE_MINSIZEREL_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
296 # isnan might not be real symbol, so can't check using function_exists
297 check_cxx_source_compiles(
299 void f() { isnan(0.0);} "
302 check_cxx_source_compiles(
304 void f() { std::isnan(0.0);} "
307 if(CMAKE_COMPILER_IS_GNUCXX)
308 set(WARNING_FLAGS_CXX "-Wall")
309 set(WARNING_FLAGS_C "-Wall")
311 # certain GCC versions don't provide the atomic builds, and hence
312 # require is to provide them in SGAtomic.cxx
313 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
314 check_cxx_source_compiles(
315 "int main() { unsigned mValue; return __sync_add_and_fetch(&mValue, 1); }"
316 GCC_ATOMIC_BUILTINS_FOUND)
317 endif(CMAKE_COMPILER_IS_GNUCXX)
319 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
320 set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
321 set(WARNING_FLAGS_C "-Wall")
327 add_definitions(-D_WIN32_WINNT=0x501)
331 # turn off various warnings
332 # foreach(warning 4244 4251 4267 4275 4290 4786 4305 4996)
333 # SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
334 # endforeach(warning)
336 set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996 /wd4250 -Dstrdup=_strdup")
337 if (${MSVC_VERSION} GREATER 1599)
338 set( MSVC_LD_FLAGS "/FORCE:MULTIPLE" )
339 endif (${MSVC_VERSION} GREATER 1599)
343 set(HAVE_GETLOCALTIME 1)
345 set( WINSOCK_LIBRARY "ws2_32.lib" )
346 set( RT_LIBRARY "winmm" )
349 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
350 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
351 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MSVC_LD_FLAGS}")
353 include_directories(${PROJECT_SOURCE_DIR})
354 include_directories(${PROJECT_SOURCE_DIR}/simgear/canvas/ShivaVG/include)
355 include_directories(${PROJECT_BINARY_DIR}/simgear)
357 include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS}
358 ${Boost_INCLUDE_DIRS}
360 ${OPENAL_INCLUDE_DIR}
361 ${LibArchive_INCLUDE_DIRS}
364 add_definitions(-DHAVE_CONFIG_H)
366 # configure a header file to pass some of the CMake settings
369 "${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
370 "${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
374 # enable CTest / make test target
375 message(STATUS "Tests: ENABLED")
380 message(STATUS "Tests: DISABLED")
383 # always set TEST_LIBS as it is also used by other tools/applications
384 # TODO maybe better rename?
391 ${CMAKE_THREAD_LIBS_INIT}
395 ${CORE_SERVICES_LIBRARY})
398 if(NOT SIMGEAR_HEADLESS)
405 install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h DESTINATION include/simgear/)
407 add_subdirectory(3rdparty)
408 add_subdirectory(simgear)
410 if (NOT EMBEDDED_SIMGEAR)
411 #-----------------------------------------------------------------------------
413 #-----------------------------------------------------------------------------
415 "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in"
416 "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
418 ADD_CUSTOM_TARGET(uninstall
419 "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")