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 # use simgear version also as the SO version (if building SOs)
14 SET(SIMGEAR_SOVERSION ${SIMGEAR_VERSION})
16 # Warning when build is not an out-of-source build.
17 string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" 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}")
24 if (NOT EMBEDDED_SIMGEAR)
26 SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/COPYING")
27 SET(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README")
28 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Simulation support libraries for FlightGear and related projects")
29 SET(CPACK_PACKAGE_VENDOR "The FlightGear project")
30 SET(CPACK_GENERATOR "TBZ2")
31 SET(CPACK_INSTALL_CMAKE_PROJECTS ${CMAKE_CURRENT_BINARY_DIR};SimGear;ALL;/)
34 # split version string into components, note CMAKE_MATCH_0 is the entire regexp match
35 string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" CPACK_PACKAGE_VERSION ${SIMGEAR_VERSION} )
36 set(CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_MATCH_1})
37 set(CPACK_PACKAGE_VERSION_MINOR ${CMAKE_MATCH_2})
38 set(CPACK_PACKAGE_VERSION_PATCH ${CMAKE_MATCH_3})
40 message(STATUS "version is ${CPACK_PACKAGE_VERSION_MAJOR} dot ${CPACK_PACKAGE_VERSION_MINOR} dot ${CPACK_PACKAGE_VERSION_PATCH}")
42 set(CPACK_SOURCE_GENERATOR TBZ2)
43 set(CPACK_SOURCE_PACKAGE_FILE_NAME "simgear-${SIMGEAR_VERSION}" CACHE INTERNAL "tarball basename")
44 set(CPACK_SOURCE_IGNORE_FILES
45 "^${PROJECT_SOURCE_DIR}/.git;\\\\.gitignore;Makefile.am;~$;${CPACK_SOURCE_IGNORE_FILES}")
47 message(STATUS "ignoring: ${CPACK_SOURCE_IGNORE_FILES}")
52 # We have some custom .cmake scripts not in the official distribution.
53 set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/CMakeModules;${CMAKE_MODULE_PATH}")
55 # Change the default build type to something fast
56 if(NOT CMAKE_BUILD_TYPE)
57 set(CMAKE_BUILD_TYPE Release CACHE STRING
58 "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
60 endif(NOT CMAKE_BUILD_TYPE)
62 # Determine name of library installation directory, i.e. "lib" vs "lib64", which
63 # differs between all Debian-based vs all other Linux distros.
64 # See cmake bug #11964, http://cmake.org/gitweb?p=cmake.git;a=commit;h=126c993d
65 # GNUInstallDirs requires CMake >= 2.8.5, use own file for older cmake
66 if(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
67 include(GNUInstallDirs)
68 else(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
69 include(OldGNUInstallDirs)
70 endif(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
71 message(STATUS "Library installation directory: ${CMAKE_INSTALL_LIBDIR}")
73 #####################################################################################
74 # Configure library search paths
75 #####################################################################################
77 if(NOT "${CMAKE_LIBRARY_ARCHITECTURE}" STREQUAL "")
78 # Workaround for Ubuntu/Debian which introduced the "multiarch" library
79 # directory structure, which is unsupported by CMake < 2.8.10, so we need to
81 # see http://www.cmake.org/Bug/view.php?id=12049 and
82 # http://www.cmake.org/Bug/view.php?id=12037
83 list(APPEND ADDITIONAL_LIBRARY_PATHS
84 /usr/local/lib/${CMAKE_LIBRARY_ARCHITECTURE}
85 /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}
86 /lib/${CMAKE_LIBRARY_ARCHITECTURE})
87 message(STATUS "additional library directories: ${ADDITIONAL_LIBRARY_PATHS}")
91 # TBD: are these really necessary? Aren't they considered by cmake automatically?
92 list(APPEND ADDITIONAL_LIBRARY_PATHS
97 #####################################################################################
100 option(SIMGEAR_SHARED "Set to ON to build SimGear as a shared library/framework" OFF)
101 option(SYSTEM_EXPAT "Set to ON to build SimGear using the system libExpat" OFF)
103 # Building SimGear DLLs is currently not supported for MSVC.
104 set(SIMGEAR_SHARED OFF)
105 # Using a system expat is currently not supported for MSVC - it would require shared simgear (DLL).
106 set(SYSTEM_EXPAT OFF)
109 option(SIMGEAR_HEADLESS "Set to ON to build SimGear without GUI/graphics support" OFF)
110 option(JPEG_FACTORY "Enable JPEG-factory support" OFF)
111 option(ENABLE_LIBSVN "Set to ON to build SimGear with libsvnclient support" ON)
112 option(ENABLE_RTI "Set to ON to build SimGear with RTI support" OFF)
113 option(ENABLE_TESTS "Set to OFF to disable building SimGear's test applications" ON)
114 option(ENABLE_SOUND "Set to OFF to disable building SimGear's sound support" ON)
117 GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_BINARY_DIR} PATH)
119 SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
121 SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty")
123 if (EXISTS ${TEST_3RDPARTY_DIR})
124 set(MSVC_3RDPARTY_ROOT ${PARENT_DIR} CACHE PATH "Location where the third-party dependencies are extracted")
125 else (EXISTS ${TEST_3RDPARTY_DIR})
126 set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
127 endif (EXISTS ${TEST_3RDPARTY_DIR})
129 set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
132 if (MSVC AND MSVC_3RDPARTY_ROOT)
133 message(STATUS "3rdparty files located in ${MSVC_3RDPARTY_ROOT}")
134 set( OSG_MSVC "msvc" )
135 if (${MSVC_VERSION} EQUAL 1700)
136 set( OSG_MSVC ${OSG_MSVC}110 )
137 elseif (${MSVC_VERSION} EQUAL 1600)
138 set( OSG_MSVC ${OSG_MSVC}100 )
139 else (${MSVC_VERSION} EQUAL 1700)
140 set( OSG_MSVC ${OSG_MSVC}90 )
141 endif (${MSVC_VERSION} EQUAL 1700)
143 set( OSG_MSVC ${OSG_MSVC}-64 )
144 set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
146 set( MSVC_3RDPARTY_DIR 3rdParty )
149 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 )
150 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)
151 find_path(BOOST_ROOT boost/version.hpp
152 ${MSVC_3RDPARTY_ROOT}/boost
153 ${MSVC_3RDPARTY_ROOT}/boost_1_52_0
154 ${MSVC_3RDPARTY_ROOT}/boost_1_51_0
155 ${MSVC_3RDPARTY_ROOT}/boost_1_50_0
156 ${MSVC_3RDPARTY_ROOT}/boost_1_49_0
157 ${MSVC_3RDPARTY_ROOT}/boost_1_48_0
158 ${MSVC_3RDPARTY_ROOT}/boost_1_47_0
159 ${MSVC_3RDPARTY_ROOT}/boost_1_46_1
160 ${MSVC_3RDPARTY_ROOT}/boost_1_46_0
161 ${MSVC_3RDPARTY_ROOT}/boost_1_45_0
162 ${MSVC_3RDPARTY_ROOT}/boost_1_44_0
164 # set (BOOST_ROOT ${MSVC_3RDPARTY_ROOT}/boost_1_44_0)
165 message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
166 set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
167 set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
168 endif (MSVC AND MSVC_3RDPARTY_ROOT)
170 find_package(Boost REQUIRED)
171 set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
174 message(STATUS "SimGear mode: HEADLESS")
177 message(STATUS "SimGear mode: NORMAL")
178 find_package(OpenGL REQUIRED)
181 find_package(OpenAL REQUIRED)
182 message(STATUS "Sound support: ENABLED")
185 find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgGA osgUtil)
186 endif(SIMGEAR_HEADLESS)
189 message(STATUS "JPEG-factory: ENABLED")
190 find_package(JPEG REQUIRED)
191 include_directories(${JPEG_INCLUDE_DIR})
193 message(STATUS "JPEG-factory: DISABLED")
197 find_package(SvnClient)
200 message(STATUS "Subversion client support: ENABLED")
201 set(HAVE_SVN_CLIENT_H 1)
202 set(HAVE_LIBSVN_CLIENT_1 1)
204 # Oops. ENABLE_LIBSVN is ON, but svn is still missing.
205 # Provide clearly visible warning/hint, so builders know what else they should install (or disable).
206 message(WARNING "Failed to enable subversion client support. Unable to find required subversion client library. Some features may not be available (scenery download).")
207 message(WARNING "Install 'libsvn' library/DLL (libsvn-devel/libsvnclient/...). Otherwise disable subversion support (set 'ENABLE_LIBSVN' to 'OFF').")
210 message(STATUS "Subversion client support: DISABLED")
213 find_package(ZLIB REQUIRED)
214 find_package(Threads REQUIRED)
217 message(STATUS "Requested to use system Expat library, forcing SIMGEAR_SHARED to true")
218 set(SIMGEAR_SHARED ON)
219 find_package(EXPAT REQUIRED)
220 include_directories(${EXPAT_INCLUDE_DIRS})
222 message(STATUS "Using built-in expat code")
223 add_definitions(-DHAVE_EXPAT_CONFIG_H)
226 check_include_file(inttypes.h HAVE_INTTYPES_H)
227 check_include_file(sys/time.h HAVE_SYS_TIME_H)
228 check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
229 check_include_file(unistd.h HAVE_UNISTD_H)
230 check_include_file(windows.h HAVE_WINDOWS_H)
233 # ShivaVG needs inttypes.h
234 add_definitions(-DHAVE_INTTYPES_H)
238 # See if we have any rti library variant installed
239 message(STATUS "RTI: ENABLED")
242 message(STATUS "RTI: DISABLED")
245 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
246 check_function_exists(ftime HAVE_FTIME)
247 check_function_exists(timegm HAVE_TIMEGM)
248 check_function_exists(rint HAVE_RINT)
249 check_function_exists(mkdtemp HAVE_MKDTEMP)
250 check_function_exists(bcopy HAVE_BCOPY)
251 check_function_exists(mmap HAVE_MMAP)
254 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
255 check_cxx_source_compiles(
257 #if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
258 #error clock_gettime is not supported
261 int main() { return 0; }
267 if(HAVE_CLOCK_GETTIME)
268 check_library_exists(rt clock_gettime "" HAVE_RT)
272 endif(HAVE_CLOCK_GETTIME)
274 SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
275 SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
276 SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
277 SET(CMAKE_MINSIZEREL_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
279 # isnan might not be real symbol, so can't check using function_exists
280 check_cxx_source_compiles(
282 void f() { isnan(0.0);} "
285 check_cxx_source_compiles(
287 void f() { std::isnan(0.0);} "
290 if(CMAKE_COMPILER_IS_GNUCXX)
291 set(WARNING_FLAGS_CXX "-Wall")
292 set(WARNING_FLAGS_C "-Wall")
294 # certain GCC versions don't provide the atomic builds, and hence
295 # require is to provide them in SGAtomic.cxx
296 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
297 check_cxx_source_compiles(
298 "int main() { unsigned mValue; return __sync_add_and_fetch(&mValue, 1); }"
299 GCC_ATOMIC_BUILTINS_FOUND)
300 endif(CMAKE_COMPILER_IS_GNUCXX)
302 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
303 set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
304 set(WARNING_FLAGS_C "-Wall")
310 add_definitions(-D_WIN32_WINNT=0x501)
314 # turn off various warnings
315 # foreach(warning 4244 4251 4267 4275 4290 4786 4305 4996)
316 # SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
317 # endforeach(warning)
319 set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996 /wd4250 -Dstrdup=_strdup")
320 if (${MSVC_VERSION} GREATER 1599)
321 set( MSVC_LD_FLAGS "/FORCE:MULTIPLE" )
322 endif (${MSVC_VERSION} GREATER 1599)
326 set(HAVE_GETLOCALTIME 1)
328 set( WINSOCK_LIBRARY "ws2_32.lib" )
329 set( RT_LIBRARY "winmm" )
332 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
333 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
334 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MSVC_LD_FLAGS}")
336 include_directories(${PROJECT_SOURCE_DIR})
337 include_directories(${PROJECT_SOURCE_DIR}/simgear/canvas/ShivaVG/include)
338 include_directories(${PROJECT_BINARY_DIR}/simgear)
339 include_directories(${PROJECT_BINARY_DIR}/simgear/xml)
341 include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS}
342 ${Boost_INCLUDE_DIRS}
344 ${OPENAL_INCLUDE_DIR}
345 ${LibArchive_INCLUDE_DIRS}
348 add_definitions(-DHAVE_CONFIG_H)
350 # configure a header file to pass some of the CMake settings
353 "${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
354 "${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
358 "${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
359 "${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
363 # enable CTest / make test target
364 message(STATUS "Tests: ENABLED")
375 ${CMAKE_THREAD_LIBS_INIT}
381 if(NOT SIMGEAR_HEADLESS)
388 message(STATUS "Tests: DISABLED")
391 install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h DESTINATION include/simgear/)
392 add_subdirectory(simgear)
394 if (NOT EMBEDDED_SIMGEAR)
395 #-----------------------------------------------------------------------------
397 #-----------------------------------------------------------------------------
399 "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in"
400 "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
402 ADD_CUSTOM_TARGET(uninstall
403 "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")