]> git.mxchange.org Git - simgear.git/blob - CMakeLists.txt
Canvas cleanup and restructuring
[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 if (NOT MSVC)
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)
74 else()
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).
78 set(SYSTEM_EXPAT OFF)
79 endif()
80
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)
87
88 if (MSVC)
89   GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} PATH)
90   if (CMAKE_CL_64)
91     SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
92   else (CMAKE_CL_64)
93     SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty")
94   endif (CMAKE_CL_64)
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})
100 else (MSVC)
101   set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
102 endif (MSVC)
103
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)
114   if (CMAKE_CL_64)
115       set( OSG_MSVC ${OSG_MSVC}-64 )
116       set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
117   else (CMAKE_CL_64)
118       set( MSVC_3RDPARTY_DIR 3rdParty )
119   endif (CMAKE_CL_64)
120
121   set (CMAKE_LIBRARY_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/lib )
122   set (CMAKE_INCLUDE_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/include)
123   find_path(BOOST_ROOT boost/version.hpp
124                         ${MSVC_3RDPARTY_ROOT}/boost
125                         ${MSVC_3RDPARTY_ROOT}/boost_1_51_0
126                         ${MSVC_3RDPARTY_ROOT}/boost_1_50_0
127                         ${MSVC_3RDPARTY_ROOT}/boost_1_49_0
128                         ${MSVC_3RDPARTY_ROOT}/boost_1_48_0
129                         ${MSVC_3RDPARTY_ROOT}/boost_1_47_0
130                         ${MSVC_3RDPARTY_ROOT}/boost_1_46_1
131                         ${MSVC_3RDPARTY_ROOT}/boost_1_46_0
132                         ${MSVC_3RDPARTY_ROOT}/boost_1_45_0
133                         ${MSVC_3RDPARTY_ROOT}/boost_1_44_0
134                         )
135   # set (BOOST_ROOT ${MSVC_3RDPARTY_ROOT}/boost_1_44_0)
136   message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
137   set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
138   set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
139 endif (MSVC AND MSVC_3RDPARTY_ROOT)
140
141 find_package(Boost REQUIRED)
142 set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
143
144 if(SIMGEAR_HEADLESS)
145     message(STATUS "SimGear mode: HEADLESS")
146     set(ENABLE_SOUND 0)
147 else()
148     message(STATUS "SimGear mode: NORMAL")
149     find_package(OpenGL REQUIRED)
150     
151     if (ENABLE_SOUND)
152         find_package(OpenAL REQUIRED)
153     endif(ENABLE_SOUND)
154     
155     find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgGA osgUtil)
156 endif(SIMGEAR_HEADLESS)
157
158 if(JPEG_FACTORY)
159     message(STATUS "JPEG-factory: ENABLED")
160     find_package(JPEG REQUIRED)
161     include_directories(${JPEG_INCLUDE_DIR})
162 else()
163     message(STATUS "JPEG-factory: DISABLED")
164 endif(JPEG_FACTORY)
165
166 if(ENABLE_LIBSVN)
167     find_package(SvnClient)
168
169     if(LIBSVN_FOUND)
170         message(STATUS "Subversion client support: ENABLED")
171         set(HAVE_SVN_CLIENT_H 1)
172         set(HAVE_LIBSVN_CLIENT_1 1)
173     else()
174         # Oops. ENABLE_LIBSVN is ON, but svn is still missing.
175         # Provide clearly visible warning/hint, so builders know what else they should install (or disable).
176         message(WARNING "Failed to enable subversion client support. Unable to find required subversion client library. Some features may not be available (scenery download).")
177         message(WARNING "Install 'libsvn' library/DLL (libsvn-devel/libsvnclient/...). Otherwise disable subversion support (set 'ENABLE_LIBSVN' to 'OFF').")
178     endif(LIBSVN_FOUND)
179 else()
180     message(STATUS "Subversion client support: DISABLED")
181 endif(ENABLE_LIBSVN)
182
183 find_package(ZLIB REQUIRED)
184 find_package(Threads REQUIRED)
185
186 if (SYSTEM_EXPAT)
187     message(STATUS "Requested to use system Expat library, forcing SIMGEAR_SHARED to true")
188     set(SIMGEAR_SHARED ON)
189     find_package(EXPAT REQUIRED)
190     include_directories(${EXPAT_INCLUDE_DIRS})
191 else()
192     message(STATUS "Using built-in expat code")
193     add_definitions(-DHAVE_EXPAT_CONFIG_H)
194 endif(SYSTEM_EXPAT)
195
196 check_include_file(inttypes.h HAVE_INTTYPES_H)
197 check_include_file(sys/time.h HAVE_SYS_TIME_H)
198 check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
199 check_include_file(unistd.h HAVE_UNISTD_H)
200 check_include_file(windows.h HAVE_WINDOWS_H)
201
202 if(HAVE_INTTYPES_H)
203   # ShivaVG needs inttypes.h
204   add_definitions(-DHAVE_INTTYPES_H)
205 endif()
206
207 if(ENABLE_RTI)
208     # See if we have any rti library variant installed
209     message(STATUS "RTI: ENABLED")
210     find_package(RTI)
211 else()
212     message(STATUS "RTI: DISABLED")
213 endif(ENABLE_RTI)
214
215 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
216 check_function_exists(ftime HAVE_FTIME)
217 check_function_exists(timegm HAVE_TIMEGM)
218 check_function_exists(rint HAVE_RINT)
219 check_function_exists(mkdtemp HAVE_MKDTEMP)
220 check_function_exists(bcopy HAVE_BCOPY)
221 check_function_exists(mmap HAVE_MMAP)
222
223 if(HAVE_UNISTD_H)
224     set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
225     check_cxx_source_compiles(
226        "#include <unistd.h>
227         #if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
228             #error clock_gettime is not supported
229         #endif
230
231         int main() { return 0; }
232         "
233         HAVE_CLOCK_GETTIME)
234 endif(HAVE_UNISTD_H)
235
236 set(RT_LIBRARY "")
237 if(HAVE_CLOCK_GETTIME)
238     check_library_exists(rt clock_gettime "" HAVE_RT)
239     if(HAVE_RT)
240         set(RT_LIBRARY rt)
241     endif(HAVE_RT)
242 endif(HAVE_CLOCK_GETTIME)
243
244 SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
245 SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
246 SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
247 SET(CMAKE_MINSIZEREL_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
248
249 # isnan might not be real symbol, so can't check using function_exists
250 check_cxx_source_compiles(
251     "#include <cmath> 
252     void f() { isnan(0.0);} "
253     HAVE_ISNAN)
254
255 check_cxx_source_compiles(
256     "#include <cmath> 
257     void f() { std::isnan(0.0);} "
258     HAVE_STD_ISNAN)
259
260 if(CMAKE_COMPILER_IS_GNUCXX)
261     set(WARNING_FLAGS_CXX "-Wall")
262     set(WARNING_FLAGS_C   "-Wall")
263
264     # certain GCC versions don't provide the atomic builds, and hence
265     # require is to provide them in SGAtomic.cxx
266     set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
267     check_cxx_source_compiles(
268        "int main() { unsigned mValue; return __sync_add_and_fetch(&mValue, 1); }"
269         GCC_ATOMIC_BUILTINS_FOUND)
270 endif(CMAKE_COMPILER_IS_GNUCXX)
271
272 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
273    set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
274    set(WARNING_FLAGS_C   "-Wall")
275 endif()
276
277 if(WIN32)
278
279     if(MINGW)
280         add_definitions(-D_WIN32_WINNT=0x501)
281     endif()
282
283     if(MSVC)
284         # turn off various warnings
285         # foreach(warning 4244 4251 4267 4275 4290 4786 4305 4996)
286         #     SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
287         # endforeach(warning)
288         
289         set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996 /wd4250")
290     endif(MSVC)
291     
292     # assumed on Windows
293     set(HAVE_GETLOCALTIME 1)
294     
295     set( WINSOCK_LIBRARY "ws2_32.lib" )
296     set( RT_LIBRARY "winmm" )
297 endif(WIN32)
298
299 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
300 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
301
302 include_directories(${PROJECT_SOURCE_DIR})
303 include_directories(${PROJECT_SOURCE_DIR}/simgear/canvas/ShivaVG/include)
304 include_directories(${PROJECT_BINARY_DIR}/simgear)
305 include_directories(${PROJECT_BINARY_DIR}/simgear/xml)
306
307 include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS} 
308     ${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR} 
309     ${OPENAL_INCLUDE_DIR} )
310
311 add_definitions(-DHAVE_CONFIG_H)
312
313 # configure a header file to pass some of the CMake settings
314 # to the source code
315 configure_file (
316   "${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
317   "${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
318   )
319
320 configure_file (
321     "${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
322     "${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
323 )
324
325 if(ENABLE_TESTS)
326     # enable CTest / make test target
327     message(STATUS "Tests: ENABLED")
328
329     include (Dart)
330         enable_testing()
331 else()
332     message(STATUS "Tests: DISABLED")
333 endif(ENABLE_TESTS)
334
335 install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h  DESTINATION include/simgear/)
336 add_subdirectory(simgear)
337
338 #-----------------------------------------------------------------------------
339 ### uninstall target
340 #-----------------------------------------------------------------------------
341 CONFIGURE_FILE(
342   "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in"
343   "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
344   IMMEDIATE @ONLY)
345 ADD_CUSTOM_TARGET(uninstall
346   "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")