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}")
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)
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).
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)
89 GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} PATH)
91 SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
93 SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty")
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})
101 set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
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)
115 set( OSG_MSVC ${OSG_MSVC}-64 )
116 set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
118 set( MSVC_3RDPARTY_DIR 3rdParty )
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
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)
142 find_package(Boost REQUIRED)
143 set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
146 message(STATUS "SimGear mode: HEADLESS")
149 message(STATUS "SimGear mode: NORMAL")
150 find_package(OpenGL REQUIRED)
153 find_package(OpenAL REQUIRED)
156 find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgGA osgUtil)
157 endif(SIMGEAR_HEADLESS)
160 message(STATUS "JPEG-factory: ENABLED")
161 find_package(JPEG REQUIRED)
162 include_directories(${JPEG_INCLUDE_DIR})
164 message(STATUS "JPEG-factory: DISABLED")
168 find_package(SvnClient)
171 message(STATUS "Subversion client support: ENABLED")
172 set(HAVE_SVN_CLIENT_H 1)
173 set(HAVE_LIBSVN_CLIENT_1 1)
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').")
181 message(STATUS "Subversion client support: DISABLED")
184 find_package(ZLIB REQUIRED)
185 find_package(Threads REQUIRED)
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})
193 message(STATUS "Using built-in expat code")
194 add_definitions(-DHAVE_EXPAT_CONFIG_H)
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)
204 # ShivaVG needs inttypes.h
205 add_definitions(-DHAVE_INTTYPES_H)
209 # See if we have any rti library variant installed
210 message(STATUS "RTI: ENABLED")
213 message(STATUS "RTI: DISABLED")
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)
225 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
226 check_cxx_source_compiles(
228 #if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
229 #error clock_gettime is not supported
232 int main() { return 0; }
238 if(HAVE_CLOCK_GETTIME)
239 check_library_exists(rt clock_gettime "" HAVE_RT)
243 endif(HAVE_CLOCK_GETTIME)
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")
250 # isnan might not be real symbol, so can't check using function_exists
251 check_cxx_source_compiles(
253 void f() { isnan(0.0);} "
256 check_cxx_source_compiles(
258 void f() { std::isnan(0.0);} "
261 if(CMAKE_COMPILER_IS_GNUCXX)
262 set(WARNING_FLAGS_CXX "-Wall")
263 set(WARNING_FLAGS_C "-Wall")
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)
273 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
274 set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
275 set(WARNING_FLAGS_C "-Wall")
281 add_definitions(-D_WIN32_WINNT=0x501)
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)
290 set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996 /wd4250")
294 set(HAVE_GETLOCALTIME 1)
296 set( WINSOCK_LIBRARY "ws2_32.lib" )
297 set( RT_LIBRARY "winmm" )
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}")
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)
308 include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS}
309 ${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR}
310 ${OPENAL_INCLUDE_DIR} )
312 add_definitions(-DHAVE_CONFIG_H)
314 # configure a header file to pass some of the CMake settings
317 "${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
318 "${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
322 "${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
323 "${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
327 # enable CTest / make test target
328 message(STATUS "Tests: ENABLED")
333 message(STATUS "Tests: DISABLED")
336 install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h DESTINATION include/simgear/)
337 add_subdirectory(simgear)
339 #-----------------------------------------------------------------------------
341 #-----------------------------------------------------------------------------
343 "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in"
344 "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
346 ADD_CUSTOM_TARGET(uninstall
347 "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")