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 option(SIMGEAR_SHARED "Set to ON to build SimGear as a shared library/framework" OFF)
72 option(SIMGEAR_HEADLESS "Set to ON to build SimGear without GUI/graphics support" OFF)
73 option(JPEG_FACTORY "Enable JPEG-factory support" OFF)
74 option(ENABLE_LIBSVN "Set to ON to build SimGear with libsvnclient support" ON)
75 option(ENABLE_RTI "Set to ON to build SimGear with RTI support" OFF)
76 option(ENABLE_TESTS "Set to OFF to disable building SimGear's test applications" ON)
77 option(ENABLE_SOUND "Set to OFF to disable building SimGear's sound support" ON)
78 option(SYSTEM_EXPAT "Set to ON to build SimGear using the system libExpat" OFF)
81 GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} PATH)
83 SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
85 SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty")
87 if (EXISTS ${TEST_3RDPARTY_DIR})
88 set(MSVC_3RDPARTY_ROOT ${PARENT_DIR} CACHE PATH "Location where the third-party dependencies are extracted")
89 else (EXISTS ${TEST_3RDPARTY_DIR})
90 set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
91 endif (EXISTS ${TEST_3RDPARTY_DIR})
93 set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
96 if (MSVC AND MSVC_3RDPARTY_ROOT)
97 message(STATUS "3rdparty files located in ${MSVC_3RDPARTY_ROOT}")
98 set( OSG_MSVC "msvc" )
99 if (${MSVC_VERSION} EQUAL 1700)
100 set( OSG_MSVC ${OSG_MSVC}110 )
101 elseif (${MSVC_VERSION} EQUAL 1600)
102 set( OSG_MSVC ${OSG_MSVC}100 )
103 else (${MSVC_VERSION} EQUAL 1700)
104 set( OSG_MSVC ${OSG_MSVC}90 )
105 endif (${MSVC_VERSION} EQUAL 1700)
107 set( OSG_MSVC ${OSG_MSVC}-64 )
108 set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
110 set( MSVC_3RDPARTY_DIR 3rdParty )
113 set (CMAKE_LIBRARY_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/lib )
114 set (CMAKE_INCLUDE_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/include)
115 find_path(BOOST_ROOT boost/version.hpp
116 ${MSVC_3RDPARTY_ROOT}/boost
117 ${MSVC_3RDPARTY_ROOT}/boost_1_51_0
118 ${MSVC_3RDPARTY_ROOT}/boost_1_50_0
119 ${MSVC_3RDPARTY_ROOT}/boost_1_49_0
120 ${MSVC_3RDPARTY_ROOT}/boost_1_48_0
121 ${MSVC_3RDPARTY_ROOT}/boost_1_47_0
122 ${MSVC_3RDPARTY_ROOT}/boost_1_46_1
123 ${MSVC_3RDPARTY_ROOT}/boost_1_46_0
124 ${MSVC_3RDPARTY_ROOT}/boost_1_45_0
125 ${MSVC_3RDPARTY_ROOT}/boost_1_44_0
127 # set (BOOST_ROOT ${MSVC_3RDPARTY_ROOT}/boost_1_44_0)
128 message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
129 set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
130 set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
131 endif (MSVC AND MSVC_3RDPARTY_ROOT)
133 find_package(Boost REQUIRED)
134 set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
137 message(STATUS "SimGear mode: HEADLESS")
140 message(STATUS "SimGear mode: NORMAL")
141 find_package(OpenGL REQUIRED)
144 find_package(OpenAL REQUIRED)
147 find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgGA osgUtil)
148 endif(SIMGEAR_HEADLESS)
151 message(STATUS "JPEG-factory: ENABLED")
152 find_package(JPEG REQUIRED)
153 include_directories(${JPEG_INCLUDE_DIR})
155 message(STATUS "JPEG-factory: DISABLED")
159 find_package(SvnClient)
162 message(STATUS "Subversion client support: ENABLED")
163 set(HAVE_SVN_CLIENT_H 1)
164 set(HAVE_LIBSVN_CLIENT_1 1)
166 # Oops. ENABLE_LIBSVN is ON, but svn is still missing.
167 # Provide clearly visible warning/hint, so builders know what else they should install (or disable).
168 message(WARNING "Failed to enable subversion client support. Unable to find required subversion client library. Some features may not be available (scenery download).")
169 message(WARNING "Install 'libsvn' library/DLL (libsvn-devel/libsvnclient/...). Otherwise disable subversion support (set 'ENABLE_LIBSVN' to 'OFF').")
172 message(STATUS "Subversion client support: DISABLED")
175 find_package(ZLIB REQUIRED)
176 find_package(Threads REQUIRED)
179 message(STATUS "Requested to use system Expat library, forcing SIMGEAR_SHARED to true")
180 set(SIMGEAR_SHARED ON)
181 find_package(EXPAT REQUIRED)
182 include_directories(${EXPAT_INCLUDE_DIRS})
184 message(STATUS "Using built-in expat code")
185 add_definitions(-DHAVE_EXPAT_CONFIG_H)
188 check_include_file(sys/time.h HAVE_SYS_TIME_H)
189 check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
190 check_include_file(unistd.h HAVE_UNISTD_H)
191 check_include_file(windows.h HAVE_WINDOWS_H)
194 # See if we have any rti library variant installed
195 message(STATUS "RTI: ENABLED")
198 message(STATUS "RTI: DISABLED")
201 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
202 check_function_exists(ftime HAVE_FTIME)
203 check_function_exists(timegm HAVE_TIMEGM)
204 check_function_exists(rint HAVE_RINT)
205 check_function_exists(mkdtemp HAVE_MKDTEMP)
206 check_function_exists(bcopy HAVE_BCOPY)
207 check_function_exists(mmap HAVE_MMAP)
210 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
211 check_cxx_source_compiles(
213 #if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
214 #error clock_gettime is not supported
217 int main() { return 0; }
223 if(HAVE_CLOCK_GETTIME)
224 check_library_exists(rt clock_gettime "" HAVE_RT)
228 endif(HAVE_CLOCK_GETTIME)
230 SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
231 SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
232 SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
233 SET(CMAKE_MINSIZEREL_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
235 # isnan might not be real symbol, so can't check using function_exists
236 check_cxx_source_compiles(
238 void f() { isnan(0.0);} "
241 check_cxx_source_compiles(
243 void f() { std::isnan(0.0);} "
246 if(CMAKE_COMPILER_IS_GNUCXX)
247 set(WARNING_FLAGS_CXX "-Wall")
248 set(WARNING_FLAGS_C "-Wall")
250 # certain GCC versions don't provide the atomic builds, and hence
251 # require is to provide them in SGAtomic.cxx
252 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
253 check_cxx_source_compiles(
254 "int main() { unsigned mValue; return __sync_add_and_fetch(&mValue, 1); }"
255 GCC_ATOMIC_BUILTINS_FOUND)
256 endif(CMAKE_COMPILER_IS_GNUCXX)
258 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
259 set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
260 set(WARNING_FLAGS_C "-Wall")
266 add_definitions(-D_WIN32_WINNT=0x501)
270 # turn off various warnings
271 # foreach(warning 4244 4251 4267 4275 4290 4786 4305 4996)
272 # SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
273 # endforeach(warning)
275 set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996 /wd4250")
279 set(HAVE_GETLOCALTIME 1)
281 set( WINSOCK_LIBRARY "ws2_32.lib" )
282 set( RT_LIBRARY "winmm" )
285 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
286 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
288 include_directories(${PROJECT_SOURCE_DIR})
289 include_directories(${PROJECT_BINARY_DIR}/simgear)
290 include_directories(${PROJECT_BINARY_DIR}/simgear/xml)
292 include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS}
293 ${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR}
294 ${OPENAL_INCLUDE_DIR} )
296 add_definitions(-DHAVE_CONFIG_H)
298 # configure a header file to pass some of the CMake settings
301 "${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
302 "${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
306 "${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
307 "${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
311 # enable CTest / make test target
312 message(STATUS "Tests: ENABLED")
317 message(STATUS "Tests: DISABLED")
320 install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h DESTINATION include/simgear/)
321 add_subdirectory(simgear)
323 #-----------------------------------------------------------------------------
325 #-----------------------------------------------------------------------------
327 "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in"
328 "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
330 ADD_CUSTOM_TARGET(uninstall
331 "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")