]> git.mxchange.org Git - simgear.git/blob - CMakeLists.txt
Fix CanvasText horizontal alignment.
[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 if (NOT EMBEDDED_SIMGEAR)
25     #packaging
26     SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/COPYING")
27     SET(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README")
28     SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Simulation support libraries for FlightGear and related projects")
29     SET(CPACK_PACKAGE_VENDOR "The FlightGear project")
30     SET(CPACK_GENERATOR "TBZ2")
31     SET(CPACK_INSTALL_CMAKE_PROJECTS  ${CMAKE_CURRENT_BINARY_DIR};SimGear;ALL;/)
32
33
34     # split version string into components, note CMAKE_MATCH_0 is the entire regexp match
35     string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" CPACK_PACKAGE_VERSION ${SIMGEAR_VERSION} )
36     set(CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_MATCH_1}) 
37     set(CPACK_PACKAGE_VERSION_MINOR ${CMAKE_MATCH_2})
38     set(CPACK_PACKAGE_VERSION_PATCH ${CMAKE_MATCH_3})
39
40     message(STATUS "version is ${CPACK_PACKAGE_VERSION_MAJOR} dot ${CPACK_PACKAGE_VERSION_MINOR} dot ${CPACK_PACKAGE_VERSION_PATCH}")
41
42     set(CPACK_SOURCE_GENERATOR TBZ2)
43     set(CPACK_SOURCE_PACKAGE_FILE_NAME "simgear-${SIMGEAR_VERSION}" CACHE INTERNAL "tarball basename")
44     set(CPACK_SOURCE_IGNORE_FILES
45       "^${PROJECT_SOURCE_DIR}/.git;\\\\.gitignore;Makefile.am;~$;${CPACK_SOURCE_IGNORE_FILES}")
46
47     message(STATUS "ignoring: ${CPACK_SOURCE_IGNORE_FILES}")
48     
49     include (CPack)
50 endif()
51
52 # We have some custom .cmake scripts not in the official distribution.
53 set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/CMakeModules;${CMAKE_MODULE_PATH}")
54
55 # Change the default build type to something fast
56 if(NOT CMAKE_BUILD_TYPE)
57   set(CMAKE_BUILD_TYPE Release CACHE STRING
58       "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
59       FORCE)
60 endif(NOT CMAKE_BUILD_TYPE)
61
62 # Determine name of library installation directory, i.e. "lib" vs "lib64", which
63 # differs between all Debian-based vs all other Linux distros.
64 # See cmake bug #11964, http://cmake.org/gitweb?p=cmake.git;a=commit;h=126c993d
65 # GNUInstallDirs requires CMake >= 2.8.5, use own file for older cmake
66 if(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
67   include(GNUInstallDirs)
68 else(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
69   include(OldGNUInstallDirs)
70 endif(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
71 message(STATUS "Library installation directory: ${CMAKE_INSTALL_LIBDIR}")
72
73 #####################################################################################
74 # Configure library search paths
75 #####################################################################################
76
77 if(NOT "${CMAKE_LIBRARY_ARCHITECTURE}" STREQUAL "")
78     # Workaround for Ubuntu/Debian which introduced the "multiarch" library
79     # directory structure, which is unsupported by CMake < 2.8.10, so we need to
80     # add paths manually
81     # see http://www.cmake.org/Bug/view.php?id=12049 and
82     # http://www.cmake.org/Bug/view.php?id=12037
83     list(APPEND ADDITIONAL_LIBRARY_PATHS
84          /usr/local/lib/${CMAKE_LIBRARY_ARCHITECTURE}
85          /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}
86          /lib/${CMAKE_LIBRARY_ARCHITECTURE})
87     message(STATUS "additional library directories: ${ADDITIONAL_LIBRARY_PATHS}")
88 endif()
89
90 if(NOT MSVC)
91     # TBD: are these really necessary? Aren't they considered by cmake automatically?
92     list(APPEND ADDITIONAL_LIBRARY_PATHS
93          /opt/local
94          /usr/local
95          /usr)
96 endif()
97 #####################################################################################
98
99 if (NOT MSVC)
100 option(SIMGEAR_SHARED   "Set to ON to build SimGear as a shared library/framework" OFF)
101 option(SYSTEM_EXPAT     "Set to ON to build SimGear using the system libExpat" OFF)
102 else()
103 # Building SimGear DLLs is currently not supported for MSVC.
104 set(SIMGEAR_SHARED OFF)
105 # Using a system expat is currently not supported for MSVC - it would require shared simgear (DLL).
106 set(SYSTEM_EXPAT OFF)
107 endif()
108
109 option(SIMGEAR_HEADLESS "Set to ON to build SimGear without GUI/graphics support" OFF)
110 option(JPEG_FACTORY     "Enable JPEG-factory support" OFF)
111 option(ENABLE_LIBSVN    "Set to ON to build SimGear with libsvnclient support" ON)
112 option(ENABLE_RTI       "Set to ON to build SimGear with RTI support" OFF)
113 option(ENABLE_TESTS     "Set to OFF to disable building SimGear's test applications" ON)
114 option(ENABLE_SOUND     "Set to OFF to disable building SimGear's sound support" ON)
115
116 if (MSVC)
117   GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} PATH)
118   if (CMAKE_CL_64)
119     SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
120   else (CMAKE_CL_64)
121     SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty")
122   endif (CMAKE_CL_64)
123   if (EXISTS ${TEST_3RDPARTY_DIR})
124     set(MSVC_3RDPARTY_ROOT ${PARENT_DIR} CACHE PATH "Location where the third-party dependencies are extracted")
125   else (EXISTS ${TEST_3RDPARTY_DIR})
126     set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
127   endif (EXISTS ${TEST_3RDPARTY_DIR})
128 else (MSVC)
129   set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
130 endif (MSVC)
131
132 if (MSVC AND MSVC_3RDPARTY_ROOT)
133   message(STATUS "3rdparty files located in ${MSVC_3RDPARTY_ROOT}")
134   set( OSG_MSVC "msvc" )
135   if (${MSVC_VERSION} EQUAL 1700)
136       set( OSG_MSVC ${OSG_MSVC}110 )
137   elseif (${MSVC_VERSION} EQUAL 1600)
138       set( OSG_MSVC ${OSG_MSVC}100 )
139   else (${MSVC_VERSION} EQUAL 1700)
140       set( OSG_MSVC ${OSG_MSVC}90 )
141   endif (${MSVC_VERSION} EQUAL 1700)
142   if (CMAKE_CL_64)
143       set( OSG_MSVC ${OSG_MSVC}-64 )
144       set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
145   else (CMAKE_CL_64)
146       set( MSVC_3RDPARTY_DIR 3rdParty )
147   endif (CMAKE_CL_64)
148
149   set (CMAKE_LIBRARY_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/lib ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenRTI/lib )
150   set (CMAKE_INCLUDE_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/include ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenRTI/include)
151   find_path(BOOST_ROOT boost/version.hpp
152                         ${MSVC_3RDPARTY_ROOT}/boost
153                         ${MSVC_3RDPARTY_ROOT}/boost_1_52_0
154                         ${MSVC_3RDPARTY_ROOT}/boost_1_51_0
155                         ${MSVC_3RDPARTY_ROOT}/boost_1_50_0
156                         ${MSVC_3RDPARTY_ROOT}/boost_1_49_0
157                         ${MSVC_3RDPARTY_ROOT}/boost_1_48_0
158                         ${MSVC_3RDPARTY_ROOT}/boost_1_47_0
159                         ${MSVC_3RDPARTY_ROOT}/boost_1_46_1
160                         ${MSVC_3RDPARTY_ROOT}/boost_1_46_0
161                         ${MSVC_3RDPARTY_ROOT}/boost_1_45_0
162                         ${MSVC_3RDPARTY_ROOT}/boost_1_44_0
163                         )
164   # set (BOOST_ROOT ${MSVC_3RDPARTY_ROOT}/boost_1_44_0)
165   message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
166   set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
167   set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
168 endif (MSVC AND MSVC_3RDPARTY_ROOT)
169
170 find_package(Boost REQUIRED)
171 set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
172
173 if(SIMGEAR_HEADLESS)
174     message(STATUS "SimGear mode: HEADLESS")
175     set(ENABLE_SOUND 0)
176 else()
177     message(STATUS "SimGear mode: NORMAL")
178     find_package(OpenGL REQUIRED)
179     
180     if (ENABLE_SOUND)
181         find_package(OpenAL REQUIRED)
182         message(STATUS "Sound support: ENABLED")
183     endif(ENABLE_SOUND)
184     
185     find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgGA osgUtil)
186 endif(SIMGEAR_HEADLESS)
187
188 if(JPEG_FACTORY)
189     message(STATUS "JPEG-factory: ENABLED")
190     find_package(JPEG REQUIRED)
191     include_directories(${JPEG_INCLUDE_DIR})
192 else()
193     message(STATUS "JPEG-factory: DISABLED")
194 endif(JPEG_FACTORY)
195
196 if(ENABLE_LIBSVN)
197     find_package(SvnClient)
198
199     if(LIBSVN_FOUND)
200         message(STATUS "Subversion client support: ENABLED")
201         set(HAVE_SVN_CLIENT_H 1)
202         set(HAVE_LIBSVN_CLIENT_1 1)
203     else()
204         # Oops. ENABLE_LIBSVN is ON, but svn is still missing.
205         # Provide clearly visible warning/hint, so builders know what else they should install (or disable).
206         message(WARNING "Failed to enable subversion client support. Unable to find required subversion client library. Some features may not be available (scenery download).")
207         message(WARNING "Install 'libsvn' library/DLL (libsvn-devel/libsvnclient/...). Otherwise disable subversion support (set 'ENABLE_LIBSVN' to 'OFF').")
208     endif(LIBSVN_FOUND)
209 else()
210     message(STATUS "Subversion client support: DISABLED")
211 endif(ENABLE_LIBSVN)
212
213 find_package(ZLIB REQUIRED)
214 find_package(Threads REQUIRED)
215
216 if (SYSTEM_EXPAT)
217     message(STATUS "Requested to use system Expat library, forcing SIMGEAR_SHARED to true")
218     set(SIMGEAR_SHARED ON)
219     find_package(EXPAT REQUIRED)
220     include_directories(${EXPAT_INCLUDE_DIRS})
221 else()
222     message(STATUS "Using built-in expat code")
223     add_definitions(-DHAVE_EXPAT_CONFIG_H)
224 endif(SYSTEM_EXPAT)
225
226 check_include_file(inttypes.h HAVE_INTTYPES_H)
227 check_include_file(sys/time.h HAVE_SYS_TIME_H)
228 check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
229 check_include_file(unistd.h HAVE_UNISTD_H)
230 check_include_file(windows.h HAVE_WINDOWS_H)
231
232 if(HAVE_INTTYPES_H)
233   # ShivaVG needs inttypes.h
234   add_definitions(-DHAVE_INTTYPES_H)
235 endif()
236
237 if(ENABLE_RTI)
238     # See if we have any rti library variant installed
239     message(STATUS "RTI: ENABLED")
240     find_package(RTI)
241 else()
242     message(STATUS "RTI: DISABLED")
243 endif(ENABLE_RTI)
244
245 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
246 check_function_exists(ftime HAVE_FTIME)
247 check_function_exists(timegm HAVE_TIMEGM)
248 check_function_exists(rint HAVE_RINT)
249 check_function_exists(mkdtemp HAVE_MKDTEMP)
250 check_function_exists(bcopy HAVE_BCOPY)
251 check_function_exists(mmap HAVE_MMAP)
252
253 if(HAVE_UNISTD_H)
254     set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
255     check_cxx_source_compiles(
256        "#include <unistd.h>
257         #if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
258             #error clock_gettime is not supported
259         #endif
260
261         int main() { return 0; }
262         "
263         HAVE_CLOCK_GETTIME)
264 endif(HAVE_UNISTD_H)
265
266 set(RT_LIBRARY "")
267 if(HAVE_CLOCK_GETTIME)
268     check_library_exists(rt clock_gettime "" HAVE_RT)
269     if(HAVE_RT)
270         set(RT_LIBRARY rt)
271     endif(HAVE_RT)
272 endif(HAVE_CLOCK_GETTIME)
273
274 SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
275 SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
276 SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
277 SET(CMAKE_MINSIZEREL_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
278
279 # isnan might not be real symbol, so can't check using function_exists
280 check_cxx_source_compiles(
281     "#include <cmath> 
282     void f() { isnan(0.0);} "
283     HAVE_ISNAN)
284
285 check_cxx_source_compiles(
286     "#include <cmath> 
287     void f() { std::isnan(0.0);} "
288     HAVE_STD_ISNAN)
289
290 if(CMAKE_COMPILER_IS_GNUCXX)
291     set(WARNING_FLAGS_CXX "-Wall")
292     set(WARNING_FLAGS_C   "-Wall")
293
294     # certain GCC versions don't provide the atomic builds, and hence
295     # require is to provide them in SGAtomic.cxx
296     set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
297     check_cxx_source_compiles(
298        "int main() { unsigned mValue; return __sync_add_and_fetch(&mValue, 1); }"
299         GCC_ATOMIC_BUILTINS_FOUND)
300 endif(CMAKE_COMPILER_IS_GNUCXX)
301
302 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
303    set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
304    set(WARNING_FLAGS_C   "-Wall")
305 endif()
306
307 if(WIN32)
308
309     if(MINGW)
310         add_definitions(-D_WIN32_WINNT=0x501)
311     endif()
312
313     if(MSVC)
314         # turn off various warnings
315         # foreach(warning 4244 4251 4267 4275 4290 4786 4305 4996)
316         #     SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
317         # endforeach(warning)
318         
319         set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996 /wd4250")
320     endif(MSVC)
321     
322     # assumed on Windows
323     set(HAVE_GETLOCALTIME 1)
324     
325     set( WINSOCK_LIBRARY "ws2_32.lib" )
326     set( RT_LIBRARY "winmm" )
327 endif(WIN32)
328
329 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
330 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
331
332 include_directories(${PROJECT_SOURCE_DIR})
333 include_directories(${PROJECT_SOURCE_DIR}/simgear/canvas/ShivaVG/include)
334 include_directories(${PROJECT_BINARY_DIR}/simgear)
335 include_directories(${PROJECT_BINARY_DIR}/simgear/xml)
336
337 include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS} 
338     ${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR} 
339     ${OPENAL_INCLUDE_DIR} )
340
341 add_definitions(-DHAVE_CONFIG_H)
342
343 # configure a header file to pass some of the CMake settings
344 # to the source code
345 configure_file (
346   "${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
347   "${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
348   )
349
350 configure_file (
351     "${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
352     "${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
353 )
354
355 if(ENABLE_TESTS)
356     # enable CTest / make test target
357     message(STATUS "Tests: ENABLED")
358
359     include (Dart)
360         enable_testing()
361 else()
362     message(STATUS "Tests: DISABLED")
363 endif(ENABLE_TESTS)
364
365 install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h  DESTINATION include/simgear/)
366 add_subdirectory(simgear)
367
368 if (NOT EMBEDDED_SIMGEAR)
369 #-----------------------------------------------------------------------------
370 ### uninstall target
371 #-----------------------------------------------------------------------------
372 CONFIGURE_FILE(
373   "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in"
374   "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
375   IMMEDIATE @ONLY)
376 ADD_CUSTOM_TARGET(uninstall
377   "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
378   
379 endif()
380