]> git.mxchange.org Git - simgear.git/blob - CMakeLists.txt
Remove ALUT usage from SimGear .
[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   set (BOOST_ROOT ${MSVC_3RDPARTY_ROOT}/boost_1_44_0)
112   message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
113   set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
114   set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
115 endif (MSVC AND MSVC_3RDPARTY_ROOT)
116
117 find_package(Boost REQUIRED)
118 set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
119
120 if(SIMGEAR_HEADLESS)
121     message(STATUS "SimGear mode: HEADLESS")
122 else()
123     message(STATUS "SimGear mode: NORMAL")
124     find_package(OpenGL REQUIRED)
125     find_package(OpenAL REQUIRED)
126     find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgGA osgUtil)
127 endif(SIMGEAR_HEADLESS)
128
129 if(JPEG_FACTORY)
130     message(STATUS "JPEG-factory: ENABLED")
131     find_package(JPEG REQUIRED)
132     include_directories(${JPEG_INCLUDE_DIR})
133 else()
134     message(STATUS "JPEG-factory: DISABLED")
135 endif(JPEG_FACTORY)
136
137 if(ENABLE_LIBSVN)
138     find_package(SvnClient)
139
140     if(LIBSVN_FOUND)
141         message(STATUS "Subversion client support: ENABLED")
142         set(HAVE_SVN_CLIENT_H 1)
143         set(HAVE_LIBSVN_CLIENT_1 1)
144     else()
145         # Oops. ENABLE_LIBSVN is ON, but svn is still missing.
146         # Provide clearly visible warning/hint, so builders know what else they should install (or disable).
147         message(WARNING "Failed to enable subversion client support. Unable to find required subversion client library. Some features may not be available (scenery download).")
148         message(WARNING "Install 'libsvn' library/DLL (libsvn-devel/libsvnclient/...). Otherwise disable subversion support (set 'ENABLE_LIBSVN' to 'OFF').")
149     endif(LIBSVN_FOUND)
150 else()
151     message(STATUS "Subversion client support: DISABLED")
152 endif(ENABLE_LIBSVN)
153
154 find_package(ZLIB REQUIRED)
155 find_package(Threads REQUIRED)
156
157 check_include_file(sys/time.h HAVE_SYS_TIME_H)
158 check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
159 check_include_file(unistd.h HAVE_UNISTD_H)
160 check_include_file(windows.h HAVE_WINDOWS_H)
161
162 if(ENABLE_RTI)
163     # See if we have any rti library variant installed
164     message(STATUS "RTI: ENABLED")
165     find_package(RTI)
166 else()
167     message(STATUS "RTI: DISABLED")
168 endif(ENABLE_RTI)
169
170 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
171 check_function_exists(ftime HAVE_FTIME)
172 check_function_exists(timegm HAVE_TIMEGM)
173 check_function_exists(rint HAVE_RINT)
174 check_function_exists(mkdtemp HAVE_MKDTEMP)
175 check_function_exists(bcopy HAVE_BCOPY)
176 check_function_exists(mmap HAVE_MMAP)
177
178 if(HAVE_UNISTD_H)
179     set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
180     check_cxx_source_compiles(
181        "#include <unistd.h>
182         #if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
183             #error clock_gettime is not supported
184         #endif
185
186         int main() { return 0; }
187         "
188         HAVE_CLOCK_GETTIME)
189 endif(HAVE_UNISTD_H)
190
191 set(RT_LIBRARY "")
192 if(HAVE_CLOCK_GETTIME)
193     check_library_exists(rt clock_gettime "" HAVE_RT)
194     if(HAVE_RT)
195         set(RT_LIBRARY rt)
196     endif(HAVE_RT)
197 endif(HAVE_CLOCK_GETTIME)
198
199 SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
200 SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
201 SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
202 SET(CMAKE_MINSIZEREL_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
203
204 # isnan might not be real symbol, so can't check using function_exists
205 check_cxx_source_compiles(
206     "#include <cmath> 
207     void f() { isnan(0.0);} "
208     HAVE_ISNAN)
209
210 if(CMAKE_COMPILER_IS_GNUCXX)
211     set(WARNING_FLAGS_CXX "-Wall")
212     set(WARNING_FLAGS_C   "-Wall")
213
214     # certain GCC versions don't provide the atomic builds, and hence
215     # require is to provide them in SGAtomic.cxx
216     set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
217     check_cxx_source_compiles(
218        "int main() { unsigned mValue; return __sync_add_and_fetch(&mValue, 1); }"
219         GCC_ATOMIC_BUILTINS_FOUND)
220 endif(CMAKE_COMPILER_IS_GNUCXX)
221
222 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
223    set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
224    set(WARNING_FLAGS_C   "-Wall")
225 endif()
226
227 if(WIN32)
228
229     if(MINGW)
230         add_definitions(-D_WIN32_WINNT=0x501)
231     endif()
232
233     if(MSVC)
234         # turn off various warnings
235         # foreach(warning 4244 4251 4267 4275 4290 4786 4305 4996)
236         #     SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
237         # endforeach(warning)
238         
239         set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996")
240     endif(MSVC)
241     
242     # assumed on Windows
243     set(HAVE_GETLOCALTIME 1)
244     
245     set( WINSOCK_LIBRARY "ws2_32.lib" )
246     set( RT_LIBRARY "winmm" )
247 endif(WIN32)
248
249 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
250 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
251
252 include_directories(${PROJECT_SOURCE_DIR})
253 include_directories(${PROJECT_BINARY_DIR}/simgear)
254 include_directories(${PROJECT_BINARY_DIR}/simgear/xml)
255
256 include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS} 
257     ${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR} 
258     ${OPENAL_INCLUDE_DIR} )
259
260 add_definitions(-DHAVE_CONFIG_H)
261 add_definitions(-DHAVE_EXPAT_CONFIG_H)
262
263 # configure a header file to pass some of the CMake settings
264 # to the source code
265 configure_file (
266   "${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
267   "${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
268   )
269
270 configure_file (
271     "${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
272     "${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
273 )
274
275 if(ENABLE_TESTS)
276     # enable CTest / make test target
277     message(STATUS "Tests: ENABLED")
278
279     include (Dart)
280         enable_testing()
281 else()
282     message(STATUS "Tests: DISABLED")
283 endif(ENABLE_TESTS)
284
285 install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h  DESTINATION include/simgear/)
286 add_subdirectory(simgear)
287
288 #-----------------------------------------------------------------------------
289 ### uninstall target
290 #-----------------------------------------------------------------------------
291 CONFIGURE_FILE(
292   "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in"
293   "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
294   IMMEDIATE @ONLY)
295 ADD_CUSTOM_TARGET(uninstall
296   "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")