]> git.mxchange.org Git - flightgear.git/blob - CMakeModules/FindSimGear.cmake
Fix compilation problem with MSVC 2012
[flightgear.git] / CMakeModules / FindSimGear.cmake
1 # Locate SimGear
2 # This module defines
3
4 # SIMGEAR_CORE_LIBRARIES, a list of the core static libraries
5 # SIMGEAR_LIBRARIES, a list of all the static libraries (core + scene)
6 # SIMGEAR_FOUND, if false, do not try to link to SimGear
7 # SIMGEAR_INCLUDE_DIR, where to find the headers
8 #
9 # $SIMGEAR_DIR is an environment variable that would
10 # correspond to the ./configure --prefix=$SIMGEAR_DIR
11 # used in building SimGear.
12 #
13 # Created by James Turner. This was influenced by the FindOpenAL.cmake module.
14
15 #=============================================================================
16 # Copyright 2005-2009 Kitware, Inc.
17 #
18 # Distributed under the OSI-approved BSD License (the "License");
19 # see accompanying file Copyright.txt for details.
20 #
21 # This software is distributed WITHOUT ANY WARRANTY; without even the
22 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
23 # See the License for more information.
24 #=============================================================================
25 # (To distributed this file outside of CMake, substitute the full
26 #  License text for the above reference.)
27
28 include(SelectLibraryConfigurations)
29
30 macro(find_sg_library libName varName libs)
31     set(libVarName "${varName}_LIBRARY")
32     # do not cache the library check
33     unset(${libVarName}_DEBUG CACHE)
34     unset(${libVarName}_RELEASE CACHE)
35
36     FIND_LIBRARY(${libVarName}_DEBUG
37       NAMES ${libName}${CMAKE_DEBUG_POSTFIX}
38       HINTS $ENV{SIMGEAR_DIR}
39       PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} libs64 libs libs/Win32 libs/Win64
40       PATHS
41       /usr/local
42       /usr
43       /opt
44     )
45     FIND_LIBRARY(${libVarName}_RELEASE
46       NAMES ${libName}${CMAKE_RELEASE_POSTFIX}
47       HINTS $ENV{SIMGEAR_DIR}
48       PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} libs64 libs libs/Win32 libs/Win64
49       PATHS
50       /usr/local
51       /usr
52       /opt
53     )
54     
55    # message(STATUS "before: Simgear ${${libVarName}_RELEASE} ")
56   #  message(STATUS "before: Simgear ${${libVarName}_DEBUG} ")
57     
58     select_library_configurations( ${varName} )
59
60   #  message(STATUS "after:Simgear ${${libVarName}_RELEASE} ")
61   #  message(STATUS "after:Simgear ${${libVarName}_DEBUG} ")
62
63     set(componentLibRelease ${${libVarName}_RELEASE})
64   #  message(STATUS "Simgear ${libVarName}_RELEASE ${componentLibRelease}")
65     set(componentLibDebug ${${libVarName}_DEBUG})
66    # message(STATUS "Simgear ${libVarName}_DEBUG ${componentLibDebug}")
67     
68     if (NOT ${libVarName}_DEBUG)
69         if (NOT ${libVarName}_RELEASE)
70             #message(STATUS "found ${componentLib}")
71             list(APPEND ${libs} ${componentLibRelease})
72         endif()
73     else()
74         list(APPEND ${libs} optimized ${componentLibRelease} debug ${componentLibDebug})
75     endif()
76 endmacro()
77
78 macro(find_sg_component comp libs)
79     set(compLib "sg${comp}")
80     string(TOUPPER "SIMGEAR_${comp}" libVar)
81     
82     find_sg_library(${compLib} ${libVar} ${libs})
83 endmacro()
84
85 FIND_PATH(SIMGEAR_INCLUDE_DIR simgear/math/SGMath.hxx
86   HINTS $ENV{SIMGEAR_DIR}
87   PATH_SUFFIXES include
88   PATHS
89   ~/Library/Frameworks
90   /Library/Frameworks
91   /usr/local
92   /usr
93   /opt
94 )
95
96 # make sure the simgear include directory exists
97 if (NOT SIMGEAR_INCLUDE_DIR)
98     message(FATAL_ERROR "Cannot find SimGear includes! (Forgot 'make install' for SimGear?) "
99             "Compile & INSTALL SimGear before configuring FlightGear. "
100             "When using non-standard locations, use 'SIMGEAR_DIR' to configure the SimGear location.")
101 endif()
102
103 message(STATUS "SimGear include directory: ${SIMGEAR_INCLUDE_DIR}")
104
105 # read the simgear version header file, get the version
106 file(READ ${SIMGEAR_INCLUDE_DIR}/simgear/version.h SG_VERSION_FILE)
107
108 # make sure the simgear/version.h header exists
109 if (NOT SG_VERSION_FILE)
110     message(FATAL_ERROR "Found SimGear, but it does not contain a simgear/version.h include! "
111             "SimGear installation is incomplete or mismatching.")
112 endif()
113
114 string(STRIP "${SG_VERSION_FILE}" SIMGEAR_DEFINE)
115 string(REPLACE "#define SIMGEAR_VERSION " "" SIMGEAR_VERSION "${SIMGEAR_DEFINE}")
116
117 if(NOT SIMGEAR_VERSION)
118     message(FATAL_ERROR "Unable to find SimGear or simgear/version.h does not exist/is invalid. "
119             "Make sure you have installed the SimGear ${SimGear_FIND_VERSION} includes. "
120             "When using non-standard locations, please use 'SIMGEAR_DIR' "
121             "to select the SimGear library location to be used.")
122 endif()
123
124 message(STATUS "found SimGear version: ${SIMGEAR_VERSION} (needed ${SimGear_FIND_VERSION})")
125
126 if(NOT "${SIMGEAR_VERSION}" EQUAL "${SimGear_FIND_VERSION}")
127     message(FATAL_ERROR "You have installed a mismatching SimGear version ${SIMGEAR_VERSION} "
128             "instead of ${SimGear_FIND_VERSION} as required by FlightGear. "
129             "When using multiple SimGear installations, please use 'SIMGEAR_DIR' "
130             "to select the SimGear library location to be used.")
131 endif()
132
133 # dependent packages
134 find_package(ZLIB REQUIRED)
135 find_package(Threads REQUIRED)
136
137 if(SIMGEAR_SHARED)
138     message(STATUS "looking for shared Simgear libraries")
139
140     find_sg_library(SimGearCore SIMGEAR_CORE SIMGEAR_CORE_LIBRARIES)
141     find_sg_library(SimGearScene SIMGEAR_SCENE SIMGEAR_LIBRARIES)
142
143  
144     list(APPEND SIMGEAR_LIBRARIES ${SIMGEAR_CORE_LIBRARIES})
145     set(SIMGEAR_CORE_LIBRARY_DEPENDENCIES "")
146     set(SIMGEAR_SCENE_LIBRARY_DEPENDENCIES "")
147     
148    # message(STATUS "core lib ${SIMGEAR_CORE_LIBRARIES}")
149   #  message(STATUS "all libs ${SIMGEAR_LIBRARIES}")
150 else(SIMGEAR_SHARED)
151
152     set(SIMGEAR_LIBRARIES "") # clear value
153     set(SIMGEAR_CORE_LIBRARIES "") # clear value
154     message(STATUS "looking for static SimGear libraries")
155     
156   # note the order here affects the order Simgear libraries are
157   # linked in, and hence ability to link when using a traditional
158   # linker such as GNU ld on Linux
159     set(comps
160         environment
161         nasal
162         tsync
163         bvh
164         bucket
165         io
166         serial
167         math
168         props
169         structure
170         timing
171         xml
172         misc
173         threads
174         debug
175         magvar
176     )
177
178     set(scene_comps
179         ephem
180         sky
181         material
182         tgdb
183         model
184         screen
185         util
186         sound)
187             
188     foreach(component ${comps})
189         find_sg_component(${component} SIMGEAR_CORE_LIBRARIES)
190     endforeach()
191
192     foreach(component ${scene_comps})
193         find_sg_component(${component} SIMGEAR_LIBRARIES)
194     endforeach()
195
196     # again link order matters - scene libraries depend on core ones
197     list(APPEND SIMGEAR_LIBRARIES ${SIMGEAR_CORE_LIBRARIES})
198
199     #message(STATUS "all libs ${SIMGEAR_LIBRARIES}")
200     
201     set(SIMGEAR_CORE_LIBRARY_DEPENDENCIES
202         ${CMAKE_THREAD_LIBS_INIT}
203         ${ZLIB_LIBRARY}
204         ${LIBSVN_LIBRARIES}
205         ${WINMM_LIBRARY})
206
207     set(SIMGEAR_SCENE_LIBRARY_DEPENDENCIES 
208         ${OPENAL_LIBRARY})
209
210     if(WIN32)
211         list(APPEND SIMGEAR_CORE_LIBRARY_DEPENDENCIES ws2_32.lib)
212     endif(WIN32)
213
214     if(NOT MSVC)
215         # basic timing routines on non windows systems, may be also cygwin?!
216         check_library_exists(rt clock_gettime "" have_rt)
217         if(have_rt)
218             list(APPEND SIMGEAR_CORE_LIBRARY_DEPENDENCIES rt)
219         endif(have_rt)
220     endif(NOT MSVC)
221 endif(SIMGEAR_SHARED)
222
223 if((NOT SIMGEAR_CORE_LIBRARIES)OR(NOT SIMGEAR_LIBRARIES))
224     message(FATAL_ERROR "Cannot find SimGear libraries! (Forgot 'make install' for SimGear?) "
225             "Compile & INSTALL SimGear before configuring FlightGear. "
226             "When using non-standard locations, use 'SIMGEAR_DIR' to configure the SimGear location.")
227 else()
228     message(STATUS "found SimGear libraries")
229 endif()
230
231 # now we've found SimGear, try test-compiling using its includes
232 include(CheckCXXSourceRuns)
233
234 SET(CMAKE_REQUIRED_INCLUDES ${SIMGEAR_INCLUDE_DIR})
235
236 # clear cache, run a fresh compile test every time
237 unset(SIMGEAR_COMPILE_TEST CACHE)
238
239 # disable OSG dependencies for test-compiling
240 set(CMAKE_REQUIRED_DEFINITIONS "-DNO_OPENSCENEGRAPH_INTERFACE")
241 check_cxx_source_runs(
242     "#include <cstdio>
243     #include \"simgear/version.h\"
244     #include \"simgear/math/SGMath.hxx\"
245
246     #define xstr(s) str(s)
247     #define str(s) #s
248
249     #define MIN_MAJOR ${SimGear_FIND_VERSION_MAJOR}
250     #define MIN_MINOR ${SimGear_FIND_VERSION_MINOR}
251     #define MIN_MICRO ${SimGear_FIND_VERSION_PATCH}
252
253     int main() {
254         int major, minor, micro;
255
256         /* printf(%d.%d.%d or greater, , MIN_MAJOR, MIN_MINOR, MIN_MICRO); */
257         printf(\"found %s ... \", xstr(SIMGEAR_VERSION));
258
259         sscanf( xstr(SIMGEAR_VERSION), \"%d.%d.%d\", &major, &minor, &micro );
260
261         if ( (major != MIN_MAJOR) ||
262              (minor != MIN_MINOR) ||
263              (micro != MIN_MICRO) ) {
264          return -1;
265         }
266
267         return 0;
268     }
269     "
270     SIMGEAR_COMPILE_TEST)
271
272 if(NOT SIMGEAR_COMPILE_TEST)
273     message(FATAL_ERROR "Oops, you have installed SimGear includes, however test compiling failed. "
274             "Try removing 'CMakeCache.txt' and reconfigure with 'cmake'.")
275 endif()
276 unset(CMAKE_REQUIRED_DEFINITIONS)
277
278 include(FindPackageHandleStandardArgs)
279 FIND_PACKAGE_HANDLE_STANDARD_ARGS(SimGear DEFAULT_MSG
280      SIMGEAR_LIBRARIES SIMGEAR_CORE_LIBRARIES SIMGEAR_INCLUDE_DIR SIMGEAR_COMPILE_TEST)
281