]> git.mxchange.org Git - simgear.git/blob - CMakeLists.txt
d12183e137b718e7d5b3543f80a631e2472dae0c
[simgear.git] / CMakeLists.txt
1 cmake_minimum_required (VERSION 2.6.4)
2 include (CheckFunctionExists)
3 include (CheckIncludeFile)
4 include (CheckCXXSourceCompiles)
5
6
7 project(SimGear)
8
9 # read 'version' file into a variable (stripping any newlines or spaces)
10 file(READ version versionFile)
11 string(STRIP ${versionFile} SIMGEAR_VERSION)
12
13 # use simgear version also as the SO version (if building SOs)
14 SET(SIMGEAR_SOVERSION ${SIMGEAR_VERSION})
15
16 # Warning when build is not an out-of-source build.
17 string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" InSourceBuild)
18 if(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}")
22 endif(InSourceBuild)
23
24 #packaging
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;/)
31
32
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})
38
39 message(STATUS "version is ${CPACK_PACKAGE_VERSION_MAJOR} dot ${CPACK_PACKAGE_VERSION_MINOR} dot ${CPACK_PACKAGE_VERSION_PATCH}")
40
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}")
45
46 message(STATUS "ignoring: ${CPACK_SOURCE_IGNORE_FILES}")
47
48 include (CPack)
49
50 # We have some custom .cmake scripts not in the official distribution.
51 set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/CMakeModules;${CMAKE_MODULE_PATH}")
52
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."
57       FORCE)
58 endif(NOT CMAKE_BUILD_TYPE)
59
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}")
70
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
78 if (MSVC)
79   GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} PATH)
80   if (CMAKE_CL_64)
81     SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
82   else (CMAKE_CL_64)
83     SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty")
84   endif (CMAKE_CL_64)
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})
90 else (MSVC)
91   set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
92 endif (MSVC)
93
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 1600)
98       set( OSG_MSVC ${OSG_MSVC}100 )
99   else (${MSVC_VERSION} EQUAL 1600)
100       set( OSG_MSVC ${OSG_MSVC}90 )
101   endif (${MSVC_VERSION} EQUAL 1600)
102   if (CMAKE_CL_64)
103       set( OSG_MSVC ${OSG_MSVC}-64 )
104       set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
105   else (CMAKE_CL_64)
106       set( MSVC_3RDPARTY_DIR 3rdParty )
107   endif (CMAKE_CL_64)
108
109   set (CMAKE_LIBRARY_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/lib )
110   set (CMAKE_INCLUDE_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/include)
111   find_path(BOOST_ROOT boost/version.hpp
112                         ${MSVC_3RDPARTY_ROOT}/boost
113                         ${MSVC_3RDPARTY_ROOT}/boost_1_51_0
114                         ${MSVC_3RDPARTY_ROOT}/boost_1_50_0
115                         ${MSVC_3RDPARTY_ROOT}/boost_1_49_0
116                         ${MSVC_3RDPARTY_ROOT}/boost_1_48_0
117                         ${MSVC_3RDPARTY_ROOT}/boost_1_47_0
118                         ${MSVC_3RDPARTY_ROOT}/boost_1_46_1
119                         ${MSVC_3RDPARTY_ROOT}/boost_1_46_0
120                         ${MSVC_3RDPARTY_ROOT}/boost_1_45_0
121                         ${MSVC_3RDPARTY_ROOT}/boost_1_44_0
122                         )
123   # set (BOOST_ROOT ${MSVC_3RDPARTY_ROOT}/boost_1_44_0)
124   message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
125   set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
126   set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
127 endif (MSVC AND MSVC_3RDPARTY_ROOT)
128
129 find_package(Boost REQUIRED)
130 set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
131
132 if(SIMGEAR_HEADLESS)
133     message(STATUS "SimGear mode: HEADLESS")
134 else()
135     message(STATUS "SimGear mode: NORMAL")
136     find_package(OpenGL REQUIRED)
137     find_package(OpenAL REQUIRED)
138     find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgGA osgUtil)
139 endif(SIMGEAR_HEADLESS)
140
141 if(JPEG_FACTORY)
142     message(STATUS "JPEG-factory: ENABLED")
143     find_package(JPEG REQUIRED)
144     include_directories(${JPEG_INCLUDE_DIR})
145 else()
146     message(STATUS "JPEG-factory: DISABLED")
147 endif(JPEG_FACTORY)
148
149 if(ENABLE_LIBSVN)
150     find_package(SvnClient)
151
152     if(LIBSVN_FOUND)
153         message(STATUS "Subversion client support: ENABLED")
154         set(HAVE_SVN_CLIENT_H 1)
155         set(HAVE_LIBSVN_CLIENT_1 1)
156     else()
157         # Oops. ENABLE_LIBSVN is ON, but svn is still missing.
158         # Provide clearly visible warning/hint, so builders know what else they should install (or disable).
159         message(WARNING "Failed to enable subversion client support. Unable to find required subversion client library. Some features may not be available (scenery download).")
160         message(WARNING "Install 'libsvn' library/DLL (libsvn-devel/libsvnclient/...). Otherwise disable subversion support (set 'ENABLE_LIBSVN' to 'OFF').")
161     endif(LIBSVN_FOUND)
162 else()
163     message(STATUS "Subversion client support: DISABLED")
164 endif(ENABLE_LIBSVN)
165
166 find_package(ZLIB REQUIRED)
167 find_package(Threads REQUIRED)
168
169 check_include_file(sys/time.h HAVE_SYS_TIME_H)
170 check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
171 check_include_file(unistd.h HAVE_UNISTD_H)
172 check_include_file(windows.h HAVE_WINDOWS_H)
173
174 if(ENABLE_RTI)
175     # See if we have any rti library variant installed
176     message(STATUS "RTI: ENABLED")
177     find_package(RTI)
178 else()
179     message(STATUS "RTI: DISABLED")
180 endif(ENABLE_RTI)
181
182 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
183 check_function_exists(ftime HAVE_FTIME)
184 check_function_exists(timegm HAVE_TIMEGM)
185 check_function_exists(rint HAVE_RINT)
186 check_function_exists(mkdtemp HAVE_MKDTEMP)
187 check_function_exists(bcopy HAVE_BCOPY)
188 check_function_exists(mmap HAVE_MMAP)
189
190 if(HAVE_UNISTD_H)
191     set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
192     check_cxx_source_compiles(
193        "#include <unistd.h>
194         #if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
195             #error clock_gettime is not supported
196         #endif
197
198         int main() { return 0; }
199         "
200         HAVE_CLOCK_GETTIME)
201 endif(HAVE_UNISTD_H)
202
203 set(RT_LIBRARY "")
204 if(HAVE_CLOCK_GETTIME)
205     check_library_exists(rt clock_gettime "" HAVE_RT)
206     if(HAVE_RT)
207         set(RT_LIBRARY rt)
208     endif(HAVE_RT)
209 endif(HAVE_CLOCK_GETTIME)
210
211 SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
212 SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
213 SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
214 SET(CMAKE_MINSIZEREL_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
215
216 # isnan might not be real symbol, so can't check using function_exists
217 check_cxx_source_compiles(
218     "#include <cmath> 
219     void f() { isnan(0.0);} "
220     HAVE_ISNAN)
221
222 if(CMAKE_COMPILER_IS_GNUCXX)
223     set(WARNING_FLAGS_CXX "-Wall")
224     set(WARNING_FLAGS_C   "-Wall")
225
226     # certain GCC versions don't provide the atomic builds, and hence
227     # require is to provide them in SGAtomic.cxx
228     set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
229     check_cxx_source_compiles(
230        "int main() { unsigned mValue; return __sync_add_and_fetch(&mValue, 1); }"
231         GCC_ATOMIC_BUILTINS_FOUND)
232 endif(CMAKE_COMPILER_IS_GNUCXX)
233
234 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
235    set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
236    set(WARNING_FLAGS_C   "-Wall")
237 endif()
238
239 if(WIN32)
240
241     if(MINGW)
242         add_definitions(-D_WIN32_WINNT=0x501)
243     endif()
244
245     if(MSVC)
246         # turn off various warnings
247         # foreach(warning 4244 4251 4267 4275 4290 4786 4305 4996)
248         #     SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
249         # endforeach(warning)
250         
251         set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996")
252     endif(MSVC)
253     
254     # assumed on Windows
255     set(HAVE_GETLOCALTIME 1)
256     
257     set( WINSOCK_LIBRARY "ws2_32.lib" )
258     set( RT_LIBRARY "winmm" )
259 endif(WIN32)
260
261 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
262 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
263
264 include_directories(${PROJECT_SOURCE_DIR})
265 include_directories(${PROJECT_BINARY_DIR}/simgear)
266 include_directories(${PROJECT_BINARY_DIR}/simgear/xml)
267
268 include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS} 
269     ${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR} 
270     ${OPENAL_INCLUDE_DIR} )
271
272 add_definitions(-DHAVE_CONFIG_H)
273 add_definitions(-DHAVE_EXPAT_CONFIG_H)
274
275 # configure a header file to pass some of the CMake settings
276 # to the source code
277 configure_file (
278   "${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
279   "${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
280   )
281
282 configure_file (
283     "${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
284     "${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
285 )
286
287 if(ENABLE_TESTS)
288     # enable CTest / make test target
289     message(STATUS "Tests: ENABLED")
290
291     include (Dart)
292         enable_testing()
293 else()
294     message(STATUS "Tests: DISABLED")
295 endif(ENABLE_TESTS)
296
297 install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h  DESTINATION include/simgear/)
298 add_subdirectory(simgear)
299
300 #-----------------------------------------------------------------------------
301 ### uninstall target
302 #-----------------------------------------------------------------------------
303 CONFIGURE_FILE(
304   "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in"
305   "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
306   IMMEDIATE @ONLY)
307 ADD_CUSTOM_TARGET(uninstall
308   "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")