]> git.mxchange.org Git - simgear.git/blob - CMakeLists.txt
De-virtualise SGSky to avoid a clang warning.
[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 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)
104   if (CMAKE_CL_64)
105       set( OSG_MSVC ${OSG_MSVC}-64 )
106       set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
107   else (CMAKE_CL_64)
108       set( MSVC_3RDPARTY_DIR 3rdParty )
109   endif (CMAKE_CL_64)
110
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
124                         )
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)
130
131 find_package(Boost REQUIRED)
132 set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
133
134 if(SIMGEAR_HEADLESS)
135     message(STATUS "SimGear mode: HEADLESS")
136 else()
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)
142
143 if(JPEG_FACTORY)
144     message(STATUS "JPEG-factory: ENABLED")
145     find_package(JPEG REQUIRED)
146     include_directories(${JPEG_INCLUDE_DIR})
147 else()
148     message(STATUS "JPEG-factory: DISABLED")
149 endif(JPEG_FACTORY)
150
151 if(ENABLE_LIBSVN)
152     find_package(SvnClient)
153
154     if(LIBSVN_FOUND)
155         message(STATUS "Subversion client support: ENABLED")
156         set(HAVE_SVN_CLIENT_H 1)
157         set(HAVE_LIBSVN_CLIENT_1 1)
158     else()
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').")
163     endif(LIBSVN_FOUND)
164 else()
165     message(STATUS "Subversion client support: DISABLED")
166 endif(ENABLE_LIBSVN)
167
168 find_package(ZLIB REQUIRED)
169 find_package(Threads REQUIRED)
170
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)
175
176 if(ENABLE_RTI)
177     # See if we have any rti library variant installed
178     message(STATUS "RTI: ENABLED")
179     find_package(RTI)
180 else()
181     message(STATUS "RTI: DISABLED")
182 endif(ENABLE_RTI)
183
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)
191
192 if(HAVE_UNISTD_H)
193     set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
194     check_cxx_source_compiles(
195        "#include <unistd.h>
196         #if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
197             #error clock_gettime is not supported
198         #endif
199
200         int main() { return 0; }
201         "
202         HAVE_CLOCK_GETTIME)
203 endif(HAVE_UNISTD_H)
204
205 set(RT_LIBRARY "")
206 if(HAVE_CLOCK_GETTIME)
207     check_library_exists(rt clock_gettime "" HAVE_RT)
208     if(HAVE_RT)
209         set(RT_LIBRARY rt)
210     endif(HAVE_RT)
211 endif(HAVE_CLOCK_GETTIME)
212
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")
217
218 # isnan might not be real symbol, so can't check using function_exists
219 check_cxx_source_compiles(
220     "#include <cmath> 
221     void f() { isnan(0.0);} "
222     HAVE_ISNAN)
223
224 if(CMAKE_COMPILER_IS_GNUCXX)
225     set(WARNING_FLAGS_CXX "-Wall")
226     set(WARNING_FLAGS_C   "-Wall")
227
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)
235
236 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
237    set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
238    set(WARNING_FLAGS_C   "-Wall")
239 endif()
240
241 if(WIN32)
242
243     if(MINGW)
244         add_definitions(-D_WIN32_WINNT=0x501)
245     endif()
246
247     if(MSVC)
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)
252         
253         set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996 /wd4250")
254     endif(MSVC)
255     
256     # assumed on Windows
257     set(HAVE_GETLOCALTIME 1)
258     
259     set( WINSOCK_LIBRARY "ws2_32.lib" )
260     set( RT_LIBRARY "winmm" )
261 endif(WIN32)
262
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}")
265
266 include_directories(${PROJECT_SOURCE_DIR})
267 include_directories(${PROJECT_BINARY_DIR}/simgear)
268 include_directories(${PROJECT_BINARY_DIR}/simgear/xml)
269
270 include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS} 
271     ${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR} 
272     ${OPENAL_INCLUDE_DIR} )
273
274 add_definitions(-DHAVE_CONFIG_H)
275 add_definitions(-DHAVE_EXPAT_CONFIG_H)
276
277 # configure a header file to pass some of the CMake settings
278 # to the source code
279 configure_file (
280   "${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
281   "${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
282   )
283
284 configure_file (
285     "${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
286     "${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
287 )
288
289 if(ENABLE_TESTS)
290     # enable CTest / make test target
291     message(STATUS "Tests: ENABLED")
292
293     include (Dart)
294         enable_testing()
295 else()
296     message(STATUS "Tests: DISABLED")
297 endif(ENABLE_TESTS)
298
299 install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h  DESTINATION include/simgear/)
300 add_subdirectory(simgear)
301
302 #-----------------------------------------------------------------------------
303 ### uninstall target
304 #-----------------------------------------------------------------------------
305 CONFIGURE_FILE(
306   "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in"
307   "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
308   IMMEDIATE @ONLY)
309 ADD_CUSTOM_TARGET(uninstall
310   "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")