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