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