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}")
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;/)
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})
39 message(STATUS "version is ${CPACK_PACKAGE_VERSION_MAJOR} dot ${CPACK_PACKAGE_VERSION_MINOR} dot ${CPACK_PACKAGE_VERSION_PATCH}")
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}")
46 message(STATUS "ignoring: ${CPACK_SOURCE_IGNORE_FILES}")
50 # We have some custom .cmake scripts not in the official distribution.
51 set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/CMakeModules;${CMAKE_MODULE_PATH}")
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."
58 endif(NOT CMAKE_BUILD_TYPE)
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}")
71 #####################################################################################
72 # Configure library search paths
73 #####################################################################################
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
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}")
89 # TBD: are these really necessary? Aren't they considered by cmake automatically?
90 list(APPEND ADDITIONAL_LIBRARY_PATHS
95 #####################################################################################
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)
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)
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)
115 GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} PATH)
117 SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
119 SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty")
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})
127 set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
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)
141 set( OSG_MSVC ${OSG_MSVC}-64 )
142 set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
144 set( MSVC_3RDPARTY_DIR 3rdParty )
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
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)
168 find_package(Boost REQUIRED)
169 set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
172 message(STATUS "SimGear mode: HEADLESS")
175 message(STATUS "SimGear mode: NORMAL")
176 find_package(OpenGL REQUIRED)
179 find_package(OpenAL REQUIRED)
182 find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgGA osgUtil)
183 endif(SIMGEAR_HEADLESS)
186 message(STATUS "JPEG-factory: ENABLED")
187 find_package(JPEG REQUIRED)
188 include_directories(${JPEG_INCLUDE_DIR})
190 message(STATUS "JPEG-factory: DISABLED")
194 find_package(SvnClient)
197 message(STATUS "Subversion client support: ENABLED")
198 set(HAVE_SVN_CLIENT_H 1)
199 set(HAVE_LIBSVN_CLIENT_1 1)
201 # Oops. ENABLE_LIBSVN is ON, but svn is still missing.
202 # Provide clearly visible warning/hint, so builders know what else they should install (or disable).
203 message(WARNING "Failed to enable subversion client support. Unable to find required subversion client library. Some features may not be available (scenery download).")
204 message(WARNING "Install 'libsvn' library/DLL (libsvn-devel/libsvnclient/...). Otherwise disable subversion support (set 'ENABLE_LIBSVN' to 'OFF').")
207 message(STATUS "Subversion client support: DISABLED")
210 find_package(ZLIB REQUIRED)
211 find_package(Threads REQUIRED)
214 message(STATUS "Requested to use system Expat library, forcing SIMGEAR_SHARED to true")
215 set(SIMGEAR_SHARED ON)
216 find_package(EXPAT REQUIRED)
217 include_directories(${EXPAT_INCLUDE_DIRS})
219 message(STATUS "Using built-in expat code")
220 add_definitions(-DHAVE_EXPAT_CONFIG_H)
223 check_include_file(inttypes.h HAVE_INTTYPES_H)
224 check_include_file(sys/time.h HAVE_SYS_TIME_H)
225 check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
226 check_include_file(unistd.h HAVE_UNISTD_H)
227 check_include_file(windows.h HAVE_WINDOWS_H)
230 # ShivaVG needs inttypes.h
231 add_definitions(-DHAVE_INTTYPES_H)
235 # See if we have any rti library variant installed
236 message(STATUS "RTI: ENABLED")
239 message(STATUS "RTI: DISABLED")
242 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
243 check_function_exists(ftime HAVE_FTIME)
244 check_function_exists(timegm HAVE_TIMEGM)
245 check_function_exists(rint HAVE_RINT)
246 check_function_exists(mkdtemp HAVE_MKDTEMP)
247 check_function_exists(bcopy HAVE_BCOPY)
248 check_function_exists(mmap HAVE_MMAP)
251 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
252 check_cxx_source_compiles(
254 #if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
255 #error clock_gettime is not supported
258 int main() { return 0; }
264 if(HAVE_CLOCK_GETTIME)
265 check_library_exists(rt clock_gettime "" HAVE_RT)
269 endif(HAVE_CLOCK_GETTIME)
271 SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
272 SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
273 SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
274 SET(CMAKE_MINSIZEREL_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
276 # isnan might not be real symbol, so can't check using function_exists
277 check_cxx_source_compiles(
279 void f() { isnan(0.0);} "
282 check_cxx_source_compiles(
284 void f() { std::isnan(0.0);} "
287 if(CMAKE_COMPILER_IS_GNUCXX)
288 set(WARNING_FLAGS_CXX "-Wall")
289 set(WARNING_FLAGS_C "-Wall")
291 # certain GCC versions don't provide the atomic builds, and hence
292 # require is to provide them in SGAtomic.cxx
293 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
294 check_cxx_source_compiles(
295 "int main() { unsigned mValue; return __sync_add_and_fetch(&mValue, 1); }"
296 GCC_ATOMIC_BUILTINS_FOUND)
297 endif(CMAKE_COMPILER_IS_GNUCXX)
299 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
300 set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
301 set(WARNING_FLAGS_C "-Wall")
307 add_definitions(-D_WIN32_WINNT=0x501)
311 # turn off various warnings
312 # foreach(warning 4244 4251 4267 4275 4290 4786 4305 4996)
313 # SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
314 # endforeach(warning)
316 set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996 /wd4250")
320 set(HAVE_GETLOCALTIME 1)
322 set( WINSOCK_LIBRARY "ws2_32.lib" )
323 set( RT_LIBRARY "winmm" )
326 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
327 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
329 include_directories(${PROJECT_SOURCE_DIR})
330 include_directories(${PROJECT_SOURCE_DIR}/simgear/canvas/ShivaVG/include)
331 include_directories(${PROJECT_BINARY_DIR}/simgear)
332 include_directories(${PROJECT_BINARY_DIR}/simgear/xml)
334 include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS}
335 ${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR}
336 ${OPENAL_INCLUDE_DIR} )
338 add_definitions(-DHAVE_CONFIG_H)
340 # configure a header file to pass some of the CMake settings
343 "${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
344 "${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
348 "${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
349 "${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
353 # enable CTest / make test target
354 message(STATUS "Tests: ENABLED")
359 message(STATUS "Tests: DISABLED")
362 install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h DESTINATION include/simgear/)
363 add_subdirectory(simgear)
365 #-----------------------------------------------------------------------------
367 #-----------------------------------------------------------------------------
369 "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in"
370 "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
372 ADD_CUSTOM_TARGET(uninstall
373 "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")