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)
79 GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} PATH)
81 SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
83 SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty")
85 if (EXISTS ${TEST_3RDPARTY_DIR})
86 set(MSVC_3RDPARTY_ROOT ${PARENT_DIR} CACHE PATH "Location where the third-party dependencies are extracted")
87 else (EXISTS ${TEST_3RDPARTY_DIR})
88 set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
89 endif (EXISTS ${TEST_3RDPARTY_DIR})
91 set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
94 if (MSVC AND MSVC_3RDPARTY_ROOT)
95 message(STATUS "3rdparty files located in ${MSVC_3RDPARTY_ROOT}")
96 set( OSG_MSVC "msvc" )
97 if (${MSVC_VERSION} EQUAL 1700)
98 set( OSG_MSVC ${OSG_MSVC}110 )
99 elseif (${MSVC_VERSION} EQUAL 1600)
100 set( OSG_MSVC ${OSG_MSVC}100 )
101 else (${MSVC_VERSION} EQUAL 1700)
102 set( OSG_MSVC ${OSG_MSVC}90 )
103 endif (${MSVC_VERSION} EQUAL 1700)
105 set( OSG_MSVC ${OSG_MSVC}-64 )
106 set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
108 set( MSVC_3RDPARTY_DIR 3rdParty )
111 set (CMAKE_LIBRARY_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/lib )
112 set (CMAKE_INCLUDE_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/include)
113 find_path(BOOST_ROOT boost/version.hpp
114 ${MSVC_3RDPARTY_ROOT}/boost
115 ${MSVC_3RDPARTY_ROOT}/boost_1_51_0
116 ${MSVC_3RDPARTY_ROOT}/boost_1_50_0
117 ${MSVC_3RDPARTY_ROOT}/boost_1_49_0
118 ${MSVC_3RDPARTY_ROOT}/boost_1_48_0
119 ${MSVC_3RDPARTY_ROOT}/boost_1_47_0
120 ${MSVC_3RDPARTY_ROOT}/boost_1_46_1
121 ${MSVC_3RDPARTY_ROOT}/boost_1_46_0
122 ${MSVC_3RDPARTY_ROOT}/boost_1_45_0
123 ${MSVC_3RDPARTY_ROOT}/boost_1_44_0
125 # set (BOOST_ROOT ${MSVC_3RDPARTY_ROOT}/boost_1_44_0)
126 message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
127 set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
128 set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
129 endif (MSVC AND MSVC_3RDPARTY_ROOT)
131 find_package(Boost REQUIRED)
132 set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
135 message(STATUS "SimGear mode: HEADLESS")
137 message(STATUS "SimGear mode: NORMAL")
138 find_package(OpenGL REQUIRED)
139 find_package(OpenAL REQUIRED)
140 find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgGA osgUtil)
141 endif(SIMGEAR_HEADLESS)
144 message(STATUS "JPEG-factory: ENABLED")
145 find_package(JPEG REQUIRED)
146 include_directories(${JPEG_INCLUDE_DIR})
148 message(STATUS "JPEG-factory: DISABLED")
152 find_package(SvnClient)
155 message(STATUS "Subversion client support: ENABLED")
156 set(HAVE_SVN_CLIENT_H 1)
157 set(HAVE_LIBSVN_CLIENT_1 1)
159 # Oops. ENABLE_LIBSVN is ON, but svn is still missing.
160 # Provide clearly visible warning/hint, so builders know what else they should install (or disable).
161 message(WARNING "Failed to enable subversion client support. Unable to find required subversion client library. Some features may not be available (scenery download).")
162 message(WARNING "Install 'libsvn' library/DLL (libsvn-devel/libsvnclient/...). Otherwise disable subversion support (set 'ENABLE_LIBSVN' to 'OFF').")
165 message(STATUS "Subversion client support: DISABLED")
168 find_package(ZLIB REQUIRED)
169 find_package(Threads REQUIRED)
171 check_include_file(sys/time.h HAVE_SYS_TIME_H)
172 check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
173 check_include_file(unistd.h HAVE_UNISTD_H)
174 check_include_file(windows.h HAVE_WINDOWS_H)
177 # See if we have any rti library variant installed
178 message(STATUS "RTI: ENABLED")
181 message(STATUS "RTI: DISABLED")
184 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
185 check_function_exists(ftime HAVE_FTIME)
186 check_function_exists(timegm HAVE_TIMEGM)
187 check_function_exists(rint HAVE_RINT)
188 check_function_exists(mkdtemp HAVE_MKDTEMP)
189 check_function_exists(bcopy HAVE_BCOPY)
190 check_function_exists(mmap HAVE_MMAP)
193 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
194 check_cxx_source_compiles(
196 #if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
197 #error clock_gettime is not supported
200 int main() { return 0; }
206 if(HAVE_CLOCK_GETTIME)
207 check_library_exists(rt clock_gettime "" HAVE_RT)
211 endif(HAVE_CLOCK_GETTIME)
213 SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
214 SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
215 SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
216 SET(CMAKE_MINSIZEREL_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
218 # isnan might not be real symbol, so can't check using function_exists
219 check_cxx_source_compiles(
221 void f() { isnan(0.0);} "
224 if(CMAKE_COMPILER_IS_GNUCXX)
225 set(WARNING_FLAGS_CXX "-Wall")
226 set(WARNING_FLAGS_C "-Wall")
228 # certain GCC versions don't provide the atomic builds, and hence
229 # require is to provide them in SGAtomic.cxx
230 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
231 check_cxx_source_compiles(
232 "int main() { unsigned mValue; return __sync_add_and_fetch(&mValue, 1); }"
233 GCC_ATOMIC_BUILTINS_FOUND)
234 endif(CMAKE_COMPILER_IS_GNUCXX)
236 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
237 set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
238 set(WARNING_FLAGS_C "-Wall")
244 add_definitions(-D_WIN32_WINNT=0x501)
248 # turn off various warnings
249 # foreach(warning 4244 4251 4267 4275 4290 4786 4305 4996)
250 # SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
251 # endforeach(warning)
253 set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996 /wd4250")
257 set(HAVE_GETLOCALTIME 1)
259 set( WINSOCK_LIBRARY "ws2_32.lib" )
260 set( RT_LIBRARY "winmm" )
263 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
264 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
266 include_directories(${PROJECT_SOURCE_DIR})
267 include_directories(${PROJECT_BINARY_DIR}/simgear)
268 include_directories(${PROJECT_BINARY_DIR}/simgear/xml)
270 include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS}
271 ${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR}
272 ${OPENAL_INCLUDE_DIR} )
274 add_definitions(-DHAVE_CONFIG_H)
275 add_definitions(-DHAVE_EXPAT_CONFIG_H)
277 # configure a header file to pass some of the CMake settings
280 "${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
281 "${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
285 "${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
286 "${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
290 # enable CTest / make test target
291 message(STATUS "Tests: ENABLED")
296 message(STATUS "Tests: DISABLED")
299 install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h DESTINATION include/simgear/)
300 add_subdirectory(simgear)
302 #-----------------------------------------------------------------------------
304 #-----------------------------------------------------------------------------
306 "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in"
307 "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
309 ADD_CUSTOM_TARGET(uninstall
310 "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")