Linux multi-monitor fullscreen support
[ryzomcore.git] / CMakeModules / nel.cmake
blobbaddcfa9bba0fa17abcda5c9e65519386470db9b
1 # Force Release configuration for compiler checks\r
2 SET(CMAKE_TRY_COMPILE_CONFIGURATION "Release")\r
3 \r
4 # Force Release configuration by default\r
5 IF(NOT CMAKE_BUILD_TYPE)\r
6   SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)\r
7 ENDIF()\r
8 \r
9 # Declare CMAKE_CONFIGURATION_TYPES before PROJECT\r
10 SET(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "" FORCE)\r
12 ###\r
13 # Helper macro that generates .pc and installs it.\r
14 # Argument: name - the name of the .pc package, e.g. "nel-pacs.pc"\r
15 ###\r
16 MACRO(NL_GEN_PC name)\r
17   IF(NOT WIN32 AND WITH_INSTALL_LIBRARIES)\r
18     CONFIGURE_FILE(${name}.in "${CMAKE_CURRENT_BINARY_DIR}/${name}")\r
19     INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/${name}" DESTINATION ${NL_LIB_PREFIX}/pkgconfig)\r
20   ENDIF()\r
21 ENDMACRO(NL_GEN_PC)\r
23 ###\r
24 #\r
25 ###\r
26 MACRO(NL_TARGET_LIB name)\r
27   IF(WITH_STATIC)\r
28     ADD_LIBRARY(${name} STATIC ${ARGN})\r
29   ELSE()\r
30     ADD_LIBRARY(${name} SHARED ${ARGN})\r
31   ENDIF()\r
32 ENDMACRO(NL_TARGET_LIB)\r
34 ###\r
35 #\r
36 ###\r
37 MACRO(NL_TARGET_DRIVER name)\r
38   IF(WITH_STATIC_DRIVERS)\r
39     ADD_LIBRARY(${name} STATIC ${ARGN})\r
40   ELSE()\r
41     ADD_LIBRARY(${name} MODULE ${ARGN})\r
42   ENDIF()\r
43 ENDMACRO(NL_TARGET_DRIVER)\r
45 ###\r
46 # Helper macro that sets the default library properties.\r
47 # Argument: name - the target name whose properties are being set\r
48 # Argument:\r
49 ###\r
50 MACRO(NL_DEFAULT_PROPS name label)\r
51   IF(TARGET revision)\r
52     # explicitly say that the target depends on revision.h\r
53     ADD_DEPENDENCIES(${name} revision)\r
54   ENDIF()\r
56   # Note: This is just a workaround for a CMake bug generating VS10 files with a colon in the project name.\r
57   # CMake Bug ID: http://www.cmake.org/Bug/view.php?id=11819\r
58   STRING(REGEX REPLACE "\\:" " -" proj_label ${label})\r
59   SET_TARGET_PROPERTIES(${name} PROPERTIES PROJECT_LABEL ${proj_label})\r
60   GET_TARGET_PROPERTY(type ${name} TYPE)\r
61   IF(${type} STREQUAL SHARED_LIBRARY)\r
62     # Set versions only if target is a shared library\r
63     SET_TARGET_PROPERTIES(${name} PROPERTIES\r
64       VERSION ${NL_VERSION} SOVERSION ${NL_VERSION_MAJOR})\r
65     IF(NL_LIB_PREFIX)\r
66       SET_TARGET_PROPERTIES(${name} PROPERTIES INSTALL_NAME_DIR ${NL_LIB_PREFIX})\r
67     ENDIF()\r
68   ENDIF()\r
70   IF(${type} STREQUAL EXECUTABLE AND WIN32 AND NOT MINGW)\r
71     # check if using a GUI\r
72     GET_TARGET_PROPERTY(_VALUE ${name} WIN32_EXECUTABLE)\r
74     IF(TARGET_X64)\r
75       # Target Windows XP 64 bits\r
76       SET(_SUBSYSTEM_VERSION "5.02")\r
77     ELSE()\r
78       # Target Windows XP\r
79       SET(_SUBSYSTEM_VERSION "5.01")\r
80     ENDIF()\r
82     IF(_VALUE)\r
83       # GUI\r
84       SET(_SUBSYSTEM "WINDOWS")\r
85     ELSE()\r
86       # Console\r
87       SET(_SUBSYSTEM "CONSOLE")\r
88     ENDIF()\r
90     SET_TARGET_PROPERTIES(${name} PROPERTIES\r
91       VERSION ${NL_VERSION}\r
92       SOVERSION ${NL_VERSION_MAJOR}\r
93       COMPILE_FLAGS "/GA"\r
94       LINK_FLAGS "/VERSION:${NL_VERSION_MAJOR}.${NL_VERSION_MINOR} /SUBSYSTEM:${_SUBSYSTEM},${_SUBSYSTEM_VERSION}")\r
95   ENDIF()\r
96 ENDMACRO(NL_DEFAULT_PROPS)\r
98 ###\r
99 # Adds the target suffix on Windows.\r
100 # Argument: name - the library's target name.\r
101 ###\r
102 MACRO(NL_ADD_LIB_SUFFIX name)\r
103   IF(WIN32)\r
104     SET_TARGET_PROPERTIES(${name} PROPERTIES DEBUG_POSTFIX "_d" RELEASE_POSTFIX "_r")\r
105   ENDIF()\r
106 ENDMACRO(NL_ADD_LIB_SUFFIX)\r
108 ###\r
109 # Adds the runtime link flags for Win32 binaries and links STLport.\r
110 # Argument: name - the target to add the link flags to.\r
111 ###\r
112 MACRO(NL_ADD_RUNTIME_FLAGS name)\r
113   IF(WIN32)\r
114 #    SET_TARGET_PROPERTIES(${name} PROPERTIES\r
115 #      LINK_FLAGS_DEBUG "${CMAKE_LINK_FLAGS_DEBUG}"\r
116 #      LINK_FLAGS_RELEASE "${CMAKE_LINK_FLAGS_RELEASE}")\r
117   ENDIF()\r
118   IF(WITH_STLPORT)\r
119     TARGET_LINK_LIBRARIES(${name} ${STLPORT_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})\r
120   ENDIF()\r
121 ENDMACRO(NL_ADD_RUNTIME_FLAGS)\r
123 MACRO(NL_ADD_STATIC_VID_DRIVERS name)\r
124   IF(WITH_STATIC_DRIVERS)\r
125     IF(WIN32)\r
126       IF(WITH_DRIVER_DIRECT3D)\r
127         TARGET_LINK_LIBRARIES(${name} nel_drv_direct3d_win)\r
128       ENDIF()\r
129     ENDIF()\r
131     IF(WITH_DRIVER_OPENGL)\r
132       IF(WIN32)\r
133         TARGET_LINK_LIBRARIES(${name} nel_drv_opengl_win)\r
134       ELSE()\r
135         TARGET_LINK_LIBRARIES(${name} nel_drv_opengl)\r
136       ENDIF()\r
137     ENDIF()\r
139     IF(WITH_DRIVER_OPENGLES)\r
140       IF(WIN32)\r
141         TARGET_LINK_LIBRARIES(${name} nel_drv_opengles_win)\r
142       ELSE()\r
143         TARGET_LINK_LIBRARIES(${name} nel_drv_opengles)\r
144       ENDIF()\r
145     ENDIF()\r
146   ENDIF()\r
147 ENDMACRO(NL_ADD_STATIC_VID_DRIVERS)\r
149 MACRO(NL_ADD_STATIC_SND_DRIVERS name)\r
150   IF(WITH_STATIC_DRIVERS)\r
151     IF(WIN32)\r
152       IF(WITH_DRIVER_DSOUND)\r
153         TARGET_LINK_LIBRARIES(${name} nel_drv_dsound_win)\r
154       ENDIF()\r
156       IF(WITH_DRIVER_XAUDIO2)\r
157         TARGET_LINK_LIBRARIES(${name} nel_drv_xaudio2_win)\r
158       ENDIF()\r
160       IF(WITH_DRIVER_OPENAL)\r
161         TARGET_LINK_LIBRARIES(${name} nel_drv_openal_win)\r
162       ENDIF()\r
164       IF(WITH_DRIVER_FMOD)\r
165         TARGET_LINK_LIBRARIES(${name} nel_drv_fmod_win)\r
166       ENDIF()\r
167     ELSE()\r
168       IF(WITH_DRIVER_OPENAL)\r
169         TARGET_LINK_LIBRARIES(${name} nel_drv_openal)\r
170       ENDIF()\r
172       IF(WITH_DRIVER_FMOD)\r
173         TARGET_LINK_LIBRARIES(${name} nel_drv_fmod)\r
174       ENDIF()\r
175     ENDIF()\r
177   ENDIF()\r
178 ENDMACRO(NL_ADD_STATIC_SND_DRIVERS)\r
180 ###\r
181 # Checks build vs. source location. Prevents In-Source builds.\r
182 ###\r
183 MACRO(CHECK_OUT_OF_SOURCE)\r
184   IF(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})\r
185     MESSAGE(FATAL_ERROR "\r
187 CMake generation for this project is not allowed within the source directory!\r
188 Remove the CMakeCache.txt file and try again from another folder, e.g.:\r
190    rm CMakeCache.txt\r
191    mkdir cmake\r
192    cd cmake\r
193    cmake ..\r
194     ")\r
195   ENDIF()\r
197 ENDMACRO(CHECK_OUT_OF_SOURCE)\r
199 MACRO(NL_SETUP_DEFAULT_OPTIONS)\r
200   IF(WITH_QT)\r
201     OPTION(WITH_STUDIO              "Build Core Studio"                             OFF )\r
202   ENDIF()\r
204   ###\r
205   # Features\r
206   ###\r
207   OPTION(WITH_LOGGING             "With Logging"                                  ON )\r
208   OPTION(WITH_COVERAGE            "With Code Coverage Support"                    OFF)\r
209   OPTION(WITH_PCH                 "With Precompiled Headers"                      ON )\r
210   OPTION(WITH_LOW_MEMORY          "With low memory (use the least of RAM)"        OFF)\r
211   OPTION(FINAL_VERSION            "Build in Final Version mode"                   ON )\r
213   # Default to static building on Windows.\r
214   IF(WIN32)\r
215     OPTION(WITH_STATIC            "With static libraries."                        ON )\r
216   ELSE()\r
217     OPTION(WITH_STATIC            "With static libraries."                        OFF)\r
218   ENDIF()\r
219   IF (WITH_STATIC)\r
220     OPTION(WITH_STATIC_LIBXML2    "With static libxml2"                           ON )\r
221   ELSE()\r
222     OPTION(WITH_STATIC_LIBXML2    "With static libxml2"                           OFF)\r
223   ENDIF()\r
224   IF (WITH_STATIC)\r
225     OPTION(WITH_STATIC_CURL       "With static curl"                              ON )\r
226   ELSE()\r
227     OPTION(WITH_STATIC_CURL       "With static curl"                              OFF)\r
228   ENDIF()\r
229   IF(APPLE)\r
230     OPTION(WITH_LIBXML2_ICONV     "With libxml2 using iconv"                      ON )\r
231   ELSE()\r
232     OPTION(WITH_LIBXML2_ICONV     "With libxml2 using iconv"                      OFF)\r
233   ENDIF()\r
234   OPTION(WITH_STATIC_DRIVERS      "With static drivers."                          OFF)\r
235   IF(WIN32)\r
236     OPTION(WITH_EXTERNAL          "With provided external."                       ON )\r
237   ELSE()\r
238     OPTION(WITH_EXTERNAL          "With provided external."                       OFF)\r
239   ENDIF()\r
240   OPTION(WITH_STATIC_EXTERNAL     "With static external libraries"                OFF)\r
241   OPTION(WITH_STATIC_RUNTIMES     "Use only static C++ runtimes"                  OFF)\r
242   IF(UNIX AND NOT APPLE)\r
243     OPTION(WITH_UNIX_STRUCTURE    "Use UNIX structure (bin, include, lib)"        ON )\r
244   ELSE()\r
245     OPTION(WITH_UNIX_STRUCTURE    "Use UNIX structure (bin, include, lib)"        OFF)\r
246   ENDIF()\r
247   OPTION(WITH_INSTALL_LIBRARIES   "Install development files."                    ON )\r
249   OPTION(WITH_ASSIMP              "Use assimp exporter"                           OFF)\r
250   OPTION(WITH_LIBGSF              "Use libgsf for max file library"               OFF)\r
252   OPTION(WITH_FFMPEG              "Use ffmpeg for audio decoder"                  OFF)\r
254   ###\r
255   # GUI toolkits\r
256   ###\r
257   OPTION(WITH_GTK                 "With GTK Support"                              OFF)\r
258   OPTION(WITH_QT                  "With Qt 4 Support"                             OFF)\r
259   OPTION(WITH_QT5                 "With Qt 5 Support"                             OFF)\r
261   IF(WIN32 AND MFC_FOUND)\r
262     OPTION(WITH_MFC               "With MFC Support"                              ON )\r
263   ELSE()\r
264     OPTION(WITH_MFC               "With MFC Support"                              OFF)\r
265   ENDIF()\r
267   ###\r
268   # Optional support\r
269   ###\r
270   OPTION(WITH_SYMBOLS             "Keep debug symbols in binaries"                OFF)\r
272   # only enable STLport for VC++ 2010 and less\r
273   IF(WIN32 AND MSVC_VERSION LESS 1600)\r
274     OPTION(WITH_STLPORT           "With STLport support."                         ON )\r
275   ELSE()\r
276     OPTION(WITH_STLPORT           "With STLport support."                         OFF)\r
277   ENDIF()\r
279   OPTION(BUILD_DASHBOARD          "Build to the CDash dashboard"                  OFF)\r
281   OPTION(WITH_NEL                 "Build NeL (nearly always required)."           ON )\r
282   OPTION(WITH_NELNS               "Build NeL Network Services."                   OFF)\r
283   OPTION(WITH_RYZOM               "Build Ryzom Core."                             ON )\r
284   OPTION(WITH_SNOWBALLS           "Build Snowballs."                              OFF)\r
285   OPTION(WITH_TOOLS               "Build Tools"                                   OFF)\r
287   OPTION(WITH_RYZOM_LIVE          "Use ryzom.com urls"                            OFF)\r
288 ENDMACRO(NL_SETUP_DEFAULT_OPTIONS)\r
290 MACRO(NL_SETUP_NEL_DEFAULT_OPTIONS)\r
291   ###\r
292   # Core libraries\r
293   ###\r
294   OPTION(WITH_NET                 "Build NLNET"                                   ON )\r
295   OPTION(WITH_3D                  "Build NL3D"                                    ON )\r
296   OPTION(WITH_WEB                 "Build WEB"                                     ON )\r
297   OPTION(WITH_GUI                 "Build GUI"                                     ON )\r
298   OPTION(WITH_PACS                "Build NLPACS"                                  ON )\r
299   OPTION(WITH_GEORGES             "Build NLGEORGES"                               ON )\r
300   OPTION(WITH_LIGO                "Build NLLIGO"                                  ON )\r
301   OPTION(WITH_LOGIC               "Build NLLOGIC"                                 ON )\r
302   OPTION(WITH_SOUND               "Build NLSOUND"                                 ON )\r
304   ###\r
305   # Drivers Support\r
306   ###\r
307   OPTION(WITH_DRIVER_OPENGL       "Build OpenGL Driver (3D)"                      ON )\r
308   OPTION(WITH_DRIVER_OPENGLES     "Build OpenGL ES Driver (3D)"                   OFF)\r
309   OPTION(WITH_DRIVER_DIRECT3D     "Build Direct3D Driver (3D)"                    OFF)\r
310   OPTION(WITH_DRIVER_OPENAL       "Build OpenAL Driver (Sound)"                   ON )\r
311   OPTION(WITH_DRIVER_FMOD         "Build FMOD Driver (Sound)"                     OFF)\r
312   OPTION(WITH_DRIVER_DSOUND       "Build DirectSound Driver (Sound)"              OFF)\r
313   OPTION(WITH_DRIVER_XAUDIO2      "Build XAudio2 Driver (Sound)"                  OFF)\r
315   ###\r
316   # Optional support\r
317   ###\r
318   OPTION(WITH_NEL_CEGUI           "Build CEGUI Renderer"                          OFF)\r
319   OPTION(WITH_NEL_TOOLS           "Build NeL Tools"                               ON )\r
320   OPTION(WITH_NEL_MAXPLUGIN       "Build NeL 3dsMax Plugin"                       OFF)\r
321   OPTION(WITH_NEL_SAMPLES         "Build NeL Samples"                             ON )\r
322   OPTION(WITH_NEL_TESTS           "Build NeL Unit Tests"                          ON )\r
324   OPTION(WITH_LIBOVR              "With LibOVR support"                           OFF)\r
325   OPTION(WITH_LIBVR               "With LibVR support"                            OFF)\r
326   OPTION(WITH_PERFHUD             "With NVIDIA PerfHUD support"                   OFF)\r
328   OPTION(WITH_SSE2                "With SSE2"                                     ON )\r
329   OPTION(WITH_SSE3                "With SSE3"                                     ON )\r
331   IF(NOT MSVC)\r
332     OPTION(WITH_GCC_FPMATH_BOTH   "With GCC -mfpmath=both"                        OFF)\r
333   ENDIF()\r
334 ENDMACRO(NL_SETUP_NEL_DEFAULT_OPTIONS)\r
336 MACRO(NL_SETUP_NELNS_DEFAULT_OPTIONS)\r
337   ###\r
338   # Core libraries\r
339   ###\r
340   OPTION(WITH_NELNS_SERVER        "Build NeLNS Services"                          ON )\r
341   OPTION(WITH_NELNS_LOGIN_SYSTEM  "Build NeLNS Login System Tools"                ON )\r
342 ENDMACRO(NL_SETUP_NELNS_DEFAULT_OPTIONS)\r
344 MACRO(NL_SETUP_RYZOM_DEFAULT_OPTIONS)\r
345   ###\r
346   # Core libraries\r
347   ###\r
348   OPTION(WITH_RYZOM_CLIENT        "Build Ryzom Core Client"                       ON )\r
349   OPTION(WITH_RYZOM_TOOLS         "Build Ryzom Core Tools"                        ON )\r
350   OPTION(WITH_RYZOM_SERVER        "Build Ryzom Core Services"                     ON )\r
351   OPTION(WITH_RYZOM_INSTALLER     "Build Ryzom Installer"                         OFF)\r
353   ###\r
354   # Optional support\r
355   ###\r
356   OPTION(WITH_LUA51               "Build Ryzom Core using Lua 5.1"                ON )\r
357   OPTION(WITH_LUA52               "Build Ryzom Core using Lua 5.2"                OFF)\r
358   OPTION(WITH_LUA53               "Build Ryzom Core using Lua 5.3"                OFF)\r
359   OPTION(WITH_RYZOM_CLIENT_UAC    "Ask to run as Administrator"                   OFF)\r
360   OPTION(WITH_RYZOM_PATCH         "Enable Ryzom in-game patch support"            OFF)\r
361   OPTION(WITH_RYZOM_CUSTOM_PATCH_SERVER "Only use patch server from CFG file"     OFF)\r
362   OPTION(WITH_RYZOM_STEAM         "Enable Steam features"                         OFF)\r
363   OPTION(WITH_RYZOM_SANDBOX       "Enable Sandbox under OS X"                     OFF)\r
364 ENDMACRO(NL_SETUP_RYZOM_DEFAULT_OPTIONS)\r
366 MACRO(NL_SETUP_SNOWBALLS_DEFAULT_OPTIONS)\r
367   ###\r
368   # Core libraries\r
369   ###\r
370   OPTION(WITH_SNOWBALLS_CLIENT    "Build Snowballs Client"                        ON )\r
371   OPTION(WITH_SNOWBALLS_SERVER    "Build Snowballs Services"                      ON )\r
372 ENDMACRO(NL_SETUP_SNOWBALLS_DEFAULT_OPTIONS)\r
374 MACRO(ADD_PLATFORM_FLAGS _FLAGS)\r
375   SET(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} ${_FLAGS}")\r
376   SET(PLATFORM_CXXFLAGS "${PLATFORM_CXXFLAGS} ${_FLAGS}")\r
377 ENDMACRO()\r
379 MACRO(ADD_PLATFORM_LINKFLAGS _FLAGS)\r
380   SET(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} ${_FLAGS}")\r
381 ENDMACRO()\r
383 MACRO(CONVERT_VERSION_NUMBER _VERSION_NUMBER _BASE)\r
384   SET(${_VERSION_NUMBER} 0)\r
385   FOREACH(_ARG ${ARGN})\r
386     MATH(EXPR ${_VERSION_NUMBER} "${${_VERSION_NUMBER}} * ${_BASE} + ${_ARG}")\r
387   ENDFOREACH()\r
388 ENDMACRO()\r
390 MACRO(NL_SETUP_BUILD)\r
391   #-----------------------------------------------------------------------------\r
392   # Setup the buildmode variables.\r
393   #\r
394   # None                  = NL_RELEASE\r
395   # Debug                 = NL_DEBUG\r
396   # Release               = NL_RELEASE\r
398   IF(CMAKE_BUILD_TYPE MATCHES "Debug")\r
399     SET(NL_BUILD_MODE "NL_DEBUG")\r
400   ELSE()\r
401     IF(CMAKE_BUILD_TYPE MATCHES "Release")\r
402       SET(NL_BUILD_MODE "NL_RELEASE")\r
403     ELSE()\r
404       SET(NL_BUILD_MODE "NL_RELEASE")\r
405       # enforce release mode if it's neither Debug nor Release\r
406       SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)\r
407     ENDIF()\r
408   ENDIF()\r
410   IF(CMAKE_CXX_LIBRARY_ARCHITECTURE)\r
411     SET(HOST_CPU ${CMAKE_CXX_LIBRARY_ARCHITECTURE})\r
412   ELSE()\r
413     SET(HOST_CPU ${CMAKE_HOST_SYSTEM_PROCESSOR})\r
414   ENDIF()\r
416   IF(HOST_CPU MATCHES "(amd|AMD|x86_)64")\r
417     SET(HOST_CPU "x86_64")\r
418   ELSEIF(HOST_CPU MATCHES "i.86")\r
419     SET(HOST_CPU "x86")\r
420   ENDIF()\r
422   # Determine target CPU\r
424   # If not specified, use the same CPU as host\r
425   IF(NOT TARGET_CPU)\r
426     SET(TARGET_CPU ${HOST_CPU})\r
427   ENDIF()\r
429   IF(TARGET_CPU MATCHES "(amd|AMD|x86_)64")\r
430     SET(TARGET_CPU "x86_64")\r
431   ELSEIF(TARGET_CPU MATCHES "i.86")\r
432     SET(TARGET_CPU "x86")\r
433   ENDIF()\r
435   IF(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")\r
436     SET(CLANG ON)\r
437     MESSAGE(STATUS "Using Clang ${CMAKE_CXX_COMPILER_VERSION} compiler")\r
438   ENDIF()\r
440   IF(CMAKE_GENERATOR MATCHES "Xcode")\r
441     SET(XCODE ON)\r
442     MESSAGE(STATUS "Generating Xcode project")\r
443   ENDIF()\r
445   IF(CMAKE_GENERATOR MATCHES "NMake")\r
446     SET(NMAKE ON)\r
447     MESSAGE(STATUS "Generating NMake project")\r
448   ENDIF()\r
450   IF(CMAKE_GENERATOR MATCHES "Ninja")\r
451     SET(NINJA ON)\r
452     MESSAGE(STATUS "Generating Ninja project")\r
453   ENDIF()\r
455   # If target and host CPU are the same\r
456   IF("${HOST_CPU}" STREQUAL "${TARGET_CPU}" AND NOT CMAKE_CROSSCOMPILING)\r
457     # x86-compatible CPU\r
458     IF(HOST_CPU MATCHES "x86")\r
459       IF(NOT CMAKE_SIZEOF_VOID_P)\r
460         INCLUDE (CheckTypeSize)\r
461         CHECK_TYPE_SIZE("void*"  CMAKE_SIZEOF_VOID_P)\r
462       ENDIF()\r
464       # Using 32 or 64 bits libraries\r
465       IF(CMAKE_SIZEOF_VOID_P EQUAL 8)\r
466         SET(TARGET_CPU "x86_64")\r
467       ELSE()\r
468         SET(TARGET_CPU "x86")\r
469       ENDIF()\r
470     ELSEIF(HOST_CPU MATCHES "arm")\r
471       SET(TARGET_CPU "arm")\r
472     ELSE()\r
473       SET(TARGET_CPU "unknown")\r
474       MESSAGE(STATUS "Unknown architecture: ${HOST_CPU}")\r
475     ENDIF()\r
476     # TODO: add checks for PPC\r
477   ELSE()\r
478     MESSAGE(STATUS "Compiling on ${HOST_CPU} for ${TARGET_CPU}")\r
479   ENDIF()\r
481   # Use values from environment variables\r
482   SET(PLATFORM_CFLAGS "$ENV{CFLAGS} $ENV{CPPFLAGS} ${PLATFORM_CFLAGS}")\r
483   SET(PLATFORM_CXXFLAGS "$ENV{CXXFLAGS} $ENV{CPPFLAGS} ${PLATFORM_CXXFLAGS}")\r
484   SET(PLATFORM_LINKFLAGS "$ENV{LDFLAGS} ${PLATFORM_LINKFLAGS}")\r
486   # Remove -g and -O flag because we are managing them ourself\r
487   STRING(REPLACE "-g" "" PLATFORM_CFLAGS ${PLATFORM_CFLAGS})\r
488   STRING(REPLACE "-g" "" PLATFORM_CXXFLAGS ${PLATFORM_CXXFLAGS})\r
489   STRING(REGEX REPLACE "-O[0-9s]" "" PLATFORM_CFLAGS ${PLATFORM_CFLAGS})\r
490   STRING(REGEX REPLACE "-O[0-9s]" "" PLATFORM_CXXFLAGS ${PLATFORM_CXXFLAGS})\r
492   # Strip spaces\r
493   STRING(STRIP ${PLATFORM_CFLAGS} PLATFORM_CFLAGS)\r
494   STRING(STRIP ${PLATFORM_CXXFLAGS} PLATFORM_CXXFLAGS)\r
495   STRING(STRIP ${PLATFORM_LINKFLAGS} PLATFORM_LINKFLAGS)\r
497   IF(NOT CMAKE_OSX_ARCHITECTURES)\r
498     IF(TARGET_CPU STREQUAL "x86_64")\r
499       SET(TARGET_X64 1)\r
500       SET(TARGET_X86 1)\r
501     ELSEIF(TARGET_CPU STREQUAL "x86")\r
502       SET(TARGET_X86 1)\r
503     ELSEIF(TARGET_CPU STREQUAL "arm64")\r
504       SET(TARGET_ARM 1)\r
505       SET(TARGET_ARM64 1)\r
506     ELSEIF(TARGET_CPU STREQUAL "armv7s")\r
507       SET(TARGET_ARM 1)\r
508       SET(TARGET_ARMV7S 1)\r
509     ELSEIF(TARGET_CPU STREQUAL "armv7")\r
510       SET(TARGET_ARM 1)\r
511       SET(TARGET_ARMV7 1)\r
512     ELSEIF(TARGET_CPU STREQUAL "armv6")\r
513       SET(TARGET_ARM 1)\r
514       SET(TARGET_ARMV6 1)\r
515     ELSEIF(TARGET_CPU STREQUAL "armv5")\r
516       SET(TARGET_ARM 1)\r
517       SET(TARGET_ARMV5 1)\r
518     ELSEIF(TARGET_CPU STREQUAL "arm")\r
519       SET(TARGET_ARM 1)\r
520     ELSEIF(TARGET_CPU STREQUAL "mips")\r
521       SET(TARGET_MIPS 1)\r
522     ENDIF()\r
524     IF(TARGET_ARM)\r
525       IF(TARGET_ARM64)\r
526         ADD_PLATFORM_FLAGS("-DHAVE_ARM64")\r
527       ENDIF()\r
529       IF(TARGET_ARMV7S)\r
530         ADD_PLATFORM_FLAGS("-DHAVE_ARMV7S")\r
531       ENDIF()\r
533       IF(TARGET_ARMV7)\r
534         ADD_PLATFORM_FLAGS("-DHAVE_ARMV7")\r
535       ENDIF()\r
537       IF(TARGET_ARMV6)\r
538         ADD_PLATFORM_FLAGS("-HAVE_ARMV6")\r
539       ENDIF()\r
541       ADD_PLATFORM_FLAGS("-DHAVE_ARM")\r
542     ENDIF()\r
544     IF(TARGET_X86)\r
545       ADD_PLATFORM_FLAGS("-DHAVE_X86")\r
546     ENDIF()\r
548     IF(TARGET_X64)\r
549       ADD_PLATFORM_FLAGS("-DHAVE_X64 -DHAVE_X86_64")\r
550     ENDIF()\r
552     IF(TARGET_MIPS)\r
553       ADD_PLATFORM_FLAGS("-DHAVE_MIPS")\r
554     ENDIF()\r
555   ENDIF()\r
557   # Fix library paths suffixes for Debian MultiArch\r
558   IF(LIBRARY_ARCHITECTURE)\r
559     SET(CMAKE_LIBRARY_PATH /lib/${LIBRARY_ARCHITECTURE} /usr/lib/${LIBRARY_ARCHITECTURE} ${CMAKE_LIBRARY_PATH})\r
560     IF(TARGET_X64)\r
561       SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} /lib64 /usr/lib64)\r
562     ELSEIF(TARGET_X86)\r
563       SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} /lib32 /usr/lib32)\r
564     ENDIF()\r
565   ENDIF()\r
567   IF(APPLE AND NOT IOS)\r
568     SET(CMAKE_INCLUDE_PATH /opt/local/include ${CMAKE_INCLUDE_PATH})\r
569     SET(CMAKE_LIBRARY_PATH /opt/local/lib ${CMAKE_LIBRARY_PATH})\r
570   ENDIF()\r
572   IF(WITH_LOGGING)\r
573     ADD_PLATFORM_FLAGS("-DENABLE_LOGS")\r
574   ENDIF()\r
576   SET(CUSTOM_FLAGS "" CACHE STRING "Custom compile flags (useful for /MPn)")\r
577   IF(NOT ${CUSTOM_FLAGS} STREQUAL "")\r
578     ADD_PLATFORM_FLAGS(${CUSTOM_FLAGS})\r
579   ENDIF()\r
581   IF(MSVC)\r
582     # Ignore default include paths\r
583     ADD_PLATFORM_FLAGS("/X")\r
585     IF(MSVC14)\r
586       ADD_PLATFORM_FLAGS("/Gy-")\r
587       # /Ox is working with VC++ 2015 and 2017, but custom optimizations don't exist\r
588       SET(RELEASE_CFLAGS "/Ox /GF /GS- ${RELEASE_CFLAGS}")\r
589       # without inlining it's unusable, use custom optimizations again\r
590       SET(DEBUG_CFLAGS "/Od /Ob1 /GF- ${DEBUG_CFLAGS}")\r
592       # Special cases for VC++ 2017\r
593       IF(MSVC_VERSION EQUAL "1911")\r
594         SET(MSVC1411 ON)\r
595       ELSEIF(MSVC_VERSION EQUAL "1910")\r
596         SET(MSVC1410 ON)\r
597       ENDIF()\r
598     ELSEIF(MSVC12)\r
599       ADD_PLATFORM_FLAGS("/Gy-")\r
600       # /Ox is working with VC++ 2013, but custom optimizations don't exist\r
601       SET(RELEASE_CFLAGS "/Ox /GF /GS- ${RELEASE_CFLAGS}")\r
602       # without inlining it's unusable, use custom optimizations again\r
603       SET(DEBUG_CFLAGS "/Od /Ob1 /GF- ${DEBUG_CFLAGS}")\r
604     ELSEIF(MSVC11)\r
605       ADD_PLATFORM_FLAGS("/Gy-")\r
606       # /Ox is working with VC++ 2012, but custom optimizations don't exist\r
607       SET(RELEASE_CFLAGS "/Ox /GF /GS- ${RELEASE_CFLAGS}")\r
608       # without inlining it's unusable, use custom optimizations again\r
609       SET(DEBUG_CFLAGS "/Od /Ob1 /GF- ${DEBUG_CFLAGS}")\r
610     ELSEIF(MSVC10)\r
611       ADD_PLATFORM_FLAGS("/Gy-")\r
612       # /Ox is working with VC++ 2010, but custom optimizations don't exist\r
613       SET(RELEASE_CFLAGS "/Ox /GF /GS- ${RELEASE_CFLAGS}")\r
614       # without inlining it's unusable, use custom optimizations again\r
615       SET(DEBUG_CFLAGS "/Od /Ob1 /GF- ${DEBUG_CFLAGS}")\r
616     ELSEIF(MSVC90)\r
617       ADD_PLATFORM_FLAGS("/Gy-")\r
618       # don't use a /O[012x] flag if you want custom optimizations\r
619       SET(RELEASE_CFLAGS "/Ob2 /Oi /Ot /Oy /GT /GF /GS- ${RELEASE_CFLAGS}")\r
620       # without inlining it's unusable, use custom optimizations again\r
621       SET(DEBUG_CFLAGS "/Ob1 /GF- ${DEBUG_CFLAGS}")\r
622     ELSEIF(MSVC80)\r
623       ADD_PLATFORM_FLAGS("/Gy- /Wp64")\r
624       # don't use a /O[012x] flag if you want custom optimizations\r
625       SET(RELEASE_CFLAGS "/Ox /GF /GS- ${RELEASE_CFLAGS}")\r
626       # without inlining it's unusable, use custom optimizations again\r
627       SET(DEBUG_CFLAGS "/Od /Ob1 ${DEBUG_CFLAGS}")\r
628     ELSE()\r
629       MESSAGE(FATAL_ERROR "Can't determine compiler version ${MSVC_VERSION}")\r
630     ENDIF()\r
632     ADD_PLATFORM_FLAGS("/D_CRT_SECURE_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS /D_CRT_NONSTDC_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS /D_WIN32 /DWIN32 /D_WINDOWS /wd4250")\r
634     # huge PCH\r
635     ADD_PLATFORM_FLAGS("/Zm1000")\r
637     IF(TARGET_X64)\r
638       # Fix a bug with Intellisense\r
639       ADD_PLATFORM_FLAGS("/D_WIN64")\r
640       # Fix a compilation error for some big C++ files\r
641       ADD_PLATFORM_FLAGS("/bigobj")\r
642     ELSE()\r
643       # Allows 32 bits applications to use 3 GB of RAM\r
644       ADD_PLATFORM_LINKFLAGS("/LARGEADDRESSAWARE")\r
645     ENDIF()\r
647     # Exceptions are only set for C++\r
648     SET(PLATFORM_CXXFLAGS "${PLATFORM_CXXFLAGS} /EHa")\r
650     IF(WITH_SYMBOLS)\r
651       SET(NL_RELEASE_CFLAGS "/Zi ${NL_RELEASE_CFLAGS}")\r
652       SET(NL_RELEASE_LINKFLAGS "/DEBUG ${NL_RELEASE_LINKFLAGS}")\r
653     ELSE()\r
654       SET(NL_RELEASE_LINKFLAGS "/RELEASE ${NL_RELEASE_LINKFLAGS}")\r
655     ENDIF()\r
657     IF(WITH_STATIC_RUNTIMES)\r
658       SET(RUNTIME_FLAG "/MT")\r
659     ELSE()\r
660       SET(RUNTIME_FLAG "/MD")\r
661     ENDIF()\r
663     SET(NL_DEBUG_CFLAGS "/Zi ${RUNTIME_FLAG}d /RTC1 /D_DEBUG ${DEBUG_CFLAGS} ${NL_DEBUG_CFLAGS}")\r
664     SET(NL_RELEASE_CFLAGS "${RUNTIME_FLAG} /DNDEBUG ${RELEASE_CFLAGS} ${NL_RELEASE_CFLAGS}")\r
665     SET(NL_DEBUG_LINKFLAGS "/DEBUG /OPT:NOREF /OPT:NOICF /NODEFAULTLIB:msvcrt ${MSVC_INCREMENTAL_YES_FLAG} ${NL_DEBUG_LINKFLAGS}")\r
666     SET(NL_RELEASE_LINKFLAGS "/OPT:REF /OPT:ICF /INCREMENTAL:NO ${NL_RELEASE_LINKFLAGS}")\r
668     IF(WITH_WARNINGS)\r
669       SET(DEBUG_CFLAGS "/W4 ${DEBUG_CFLAGS}")\r
670     ELSE()\r
671       SET(DEBUG_CFLAGS "/W3 ${DEBUG_CFLAGS}")\r
672     ENDIF()\r
673   ELSE()\r
674     IF(WIN32)\r
675       ADD_PLATFORM_FLAGS("-DWIN32 -D_WIN32")\r
677       IF(CLANG)\r
678         ADD_PLATFORM_FLAGS("-nobuiltininc")\r
679       ENDIF()\r
680     ENDIF()\r
682     IF(WITH_SSE3)\r
683       ADD_PLATFORM_FLAGS("-msse3")\r
684     ENDIF()\r
686     IF(WITH_GCC_FPMATH_BOTH)\r
687       ADD_PLATFORM_FLAGS("-mfpmath=both")\r
688     ENDIF()\r
690     IF(APPLE)\r
691       SET(OBJC_FLAGS -fobjc-abi-version=2 -fobjc-legacy-dispatch -fobjc-weak)\r
693       IF(NOT XCODE)\r
694         IF(CMAKE_OSX_ARCHITECTURES)\r
695           SET(TARGETS_COUNT 0)\r
696           SET(_ARCHS)\r
697           FOREACH(_ARCH ${CMAKE_OSX_ARCHITECTURES})\r
698             IF(_ARCH STREQUAL "i386")\r
699               SET(_ARCHS "${_ARCHS} i386")\r
700               SET(TARGET_X86 1)\r
701               MATH(EXPR TARGETS_COUNT "${TARGETS_COUNT}+1")\r
702             ELSEIF(_ARCH STREQUAL "x86_64")\r
703               SET(_ARCHS "${_ARCHS} x86_64")\r
704               SET(TARGET_X64 1)\r
705               MATH(EXPR TARGETS_COUNT "${TARGETS_COUNT}+1")\r
706             ELSEIF(_ARCH STREQUAL "armv7s")\r
707               SET(_ARCHS "${_ARCHS} armv7s")\r
708               SET(TARGET_ARMV7S 1)\r
709               SET(TARGET_ARM 1)\r
710               MATH(EXPR TARGETS_COUNT "${TARGETS_COUNT}+1")\r
711             ELSEIF(_ARCH STREQUAL "armv7")\r
712               SET(_ARCHS "${_ARCHS} armv7")\r
713               SET(TARGET_ARMV7 1)\r
714               SET(TARGET_ARM 1)\r
715               MATH(EXPR TARGETS_COUNT "${TARGETS_COUNT}+1")\r
716             ELSEIF(_ARCH STREQUAL "armv6")\r
717               SET(_ARCHS "${_ARCHS} armv6")\r
718               SET(TARGET_ARMV6 1)\r
719               SET(TARGET_ARM 1)\r
720               MATH(EXPR TARGETS_COUNT "${TARGETS_COUNT}+1")\r
721             ELSEIF(_ARCH STREQUAL "mips")\r
722               SET(_ARCHS "${_ARCHS} mips")\r
723               SET(TARGET_MIPS 1)\r
724               MATH(EXPR TARGETS_COUNT "${TARGETS_COUNT}+1")\r
725             ELSE()\r
726               SET(_ARCHS "${_ARCHS} unknwon(${_ARCH})")\r
727             ENDIF()\r
728           ENDFOREACH(_ARCH)\r
729           MESSAGE(STATUS "Compiling under Mac OS X for ${TARGETS_COUNT} architectures: ${_ARCHS}")\r
730         ELSE()\r
731           SET(TARGETS_COUNT 0)\r
732         ENDIF()\r
734         IF(TARGETS_COUNT EQUAL 1)\r
735           IF(TARGET_ARM)\r
736             IF(TARGET_ARMV7S)\r
737               ADD_PLATFORM_FLAGS("-arch armv7s -DHAVE_ARMV7S")\r
738             ENDIF()\r
740             IF(TARGET_ARMV7)\r
741               ADD_PLATFORM_FLAGS("-arch armv7 -DHAVE_ARMV7")\r
742             ENDIF()\r
744             IF(TARGET_ARMV6)\r
745               ADD_PLATFORM_FLAGS("-arch armv6 -DHAVE_ARMV6")\r
746             ENDIF()\r
748             IF(TARGET_ARMV5)\r
749               ADD_PLATFORM_FLAGS("-arch armv5 -DHAVE_ARMV5")\r
750             ENDIF()\r
752             ADD_PLATFORM_FLAGS("-mthumb -DHAVE_ARM")\r
753           ENDIF()\r
755           IF(TARGET_X64)\r
756             ADD_PLATFORM_FLAGS("-arch x86_64 -DHAVE_X64 -DHAVE_X86_64 -DHAVE_X86")\r
757           ELSEIF(TARGET_X86)\r
758             ADD_PLATFORM_FLAGS("-arch i386 -DHAVE_X86")\r
759           ENDIF()\r
761           IF(TARGET_MIPS)\r
762             ADD_PLATFORM_FLAGS("-arch mips -DHAVE_MIPS")\r
763           ENDIF()\r
764         ELSEIF(TARGETS_COUNT EQUAL 0)\r
765           # Not using CMAKE_OSX_ARCHITECTURES, HAVE_XXX already defined before\r
766           IF(TARGET_ARM)\r
767             IF(TARGET_ARMV7S)\r
768               ADD_PLATFORM_FLAGS("-arch armv7s")\r
769             ENDIF()\r
771             IF(TARGET_ARMV7)\r
772               ADD_PLATFORM_FLAGS("-arch armv7")\r
773             ENDIF()\r
775             IF(TARGET_ARMV6)\r
776               ADD_PLATFORM_FLAGS("-arch armv6")\r
777             ENDIF()\r
779             IF(TARGET_ARMV5)\r
780               ADD_PLATFORM_FLAGS("-arch armv5")\r
781             ENDIF()\r
783             ADD_PLATFORM_FLAGS("-mthumb")\r
784           ENDIF()\r
786           IF(TARGET_X64)\r
787             ADD_PLATFORM_FLAGS("-arch x86_64")\r
788           ELSEIF(TARGET_X86)\r
789             ADD_PLATFORM_FLAGS("-arch i386")\r
790           ENDIF()\r
792           IF(TARGET_MIPS)\r
793             ADD_PLATFORM_FLAGS("-arch mips")\r
794           ENDIF()\r
795         ELSE()\r
796           IF(TARGET_ARMV6)\r
797             ADD_PLATFORM_FLAGS("-Xarch_armv6 -mthumb -Xarch_armv6 -DHAVE_ARM -Xarch_armv6 -DHAVE_ARMV6")\r
798           ENDIF()\r
800           IF(TARGET_ARMV7)\r
801             ADD_PLATFORM_FLAGS("-Xarch_armv7 -mthumb -Xarch_armv7 -DHAVE_ARM -Xarch_armv7 -DHAVE_ARMV7")\r
802           ENDIF()\r
804           IF(TARGET_X86)\r
805             ADD_PLATFORM_FLAGS("-Xarch_i386 -DHAVE_X86")\r
806           ENDIF()\r
808           IF(TARGET_X64)\r
809             ADD_PLATFORM_FLAGS("-Xarch_x86_64 -DHAVE_X64 -Xarch_x86_64 -DHAVE_X86_64")\r
810           ENDIF()\r
812           IF(TARGET_MIPS)\r
813             ADD_PLATFORM_FLAGS("-Xarch_mips -DHAVE_MIPS")\r
814           ENDIF()\r
815         ENDIF()\r
817         IF(IOS)\r
818           SET(CMAKE_OSX_SYSROOT "" CACHE PATH "" FORCE)\r
820           IF(IOS_VERSION)\r
821             PARSE_VERSION_STRING(${IOS_VERSION} IOS_VERSION_MAJOR IOS_VERSION_MINOR IOS_VERSION_PATCH)\r
822             CONVERT_VERSION_NUMBER(${IOS_VERSION_MAJOR} ${IOS_VERSION_MINOR} ${IOS_VERSION_PATCH} IOS_VERSION_NUMBER)\r
824             ADD_PLATFORM_FLAGS("-D__IPHONE_OS_VERSION_MIN_REQUIRED=${IOS_VERSION_NUMBER}")\r
825           ENDIF()\r
827           IF(CMAKE_IOS_SYSROOT)\r
828             IF(TARGET_ARMV7S)\r
829               IF(TARGETS_COUNT GREATER 1)\r
830                 SET(XARCH "-Xarch_armv7s ")\r
831               ENDIF()\r
833               ADD_PLATFORM_FLAGS("${XARCH}-isysroot${CMAKE_IOS_SYSROOT}")\r
834               ADD_PLATFORM_FLAGS("${XARCH}-miphoneos-version-min=${IOS_VERSION}")\r
835               ADD_PLATFORM_LINKFLAGS("${XARCH}-Wl,-iphoneos_version_min,${IOS_VERSION}")\r
836             ENDIF()\r
838             IF(TARGET_ARMV7)\r
839               IF(TARGETS_COUNT GREATER 1)\r
840                 SET(XARCH "-Xarch_armv7 ")\r
841               ENDIF()\r
843               ADD_PLATFORM_FLAGS("${XARCH}-isysroot${CMAKE_IOS_SYSROOT}")\r
844               ADD_PLATFORM_FLAGS("${XARCH}-miphoneos-version-min=${IOS_VERSION}")\r
845               ADD_PLATFORM_LINKFLAGS("${XARCH}-Wl,-iphoneos_version_min,${IOS_VERSION}")\r
846             ENDIF()\r
848             IF(TARGET_ARMV6)\r
849               IF(TARGETS_COUNT GREATER 1)\r
850                 SET(XARCH "-Xarch_armv6 ")\r
851               ENDIF()\r
853               ADD_PLATFORM_FLAGS("${XARCH}-isysroot${CMAKE_IOS_SYSROOT}")\r
854               ADD_PLATFORM_FLAGS("${XARCH}-miphoneos-version-min=${IOS_VERSION}")\r
855               ADD_PLATFORM_LINKFLAGS("${XARCH}-Wl,-iphoneos_version_min,${IOS_VERSION}")\r
856             ENDIF()\r
857           ENDIF()\r
859           IF(CMAKE_IOS_SIMULATOR_SYSROOT AND TARGET_X86)\r
860             IF(TARGETS_COUNT GREATER 1)\r
861               SET(XARCH "-Xarch_i386 ")\r
862             ENDIF()\r
864             ADD_PLATFORM_FLAGS("${XARCH}-isysroot${CMAKE_IOS_SIMULATOR_SYSROOT}")\r
865             ADD_PLATFORM_FLAGS("${XARCH}-mios-simulator-version-min=${IOS_VERSION}")\r
866             IF(CMAKE_OSX_DEPLOYMENT_TARGET)\r
867               ADD_PLATFORM_LINKFLAGS("${XARCH}-Wl,-macosx_version_min,${CMAKE_OSX_DEPLOYMENT_TARGET}")\r
868             ENDIF()\r
869           ENDIF()\r
870         ELSE()\r
871           # Always force -mmacosx-version-min to override environement variable\r
872           IF(CMAKE_OSX_DEPLOYMENT_TARGET)\r
873             IF(CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS "10.7")\r
874               MESSAGE(FATAL_ERROR "Minimum target for OS X is 10.7 but you're using ${CMAKE_OSX_DEPLOYMENT_TARGET}")\r
875             ENDIF()\r
876             ADD_PLATFORM_LINKFLAGS("-Wl,-macosx_version_min,${CMAKE_OSX_DEPLOYMENT_TARGET}")\r
877           ENDIF()\r
878         ENDIF()\r
880         # use libc++ under OX X to be able to use new C++ features (and else it'll use GCC 4.2.1 STL)\r
881         # minimum target is now OS X 10.7\r
882         SET(PLATFORM_CXXFLAGS "${PLATFORM_CXXFLAGS} -stdlib=libc++")\r
884         ADD_PLATFORM_LINKFLAGS("-Wl,-headerpad_max_install_names")\r
886         IF(HAVE_FLAG_SEARCH_PATHS_FIRST)\r
887           ADD_PLATFORM_LINKFLAGS("-Wl,-search_paths_first")\r
888         ENDIF()\r
889       ENDIF()\r
890     ELSE()\r
891       IF(HOST_CPU STREQUAL "x86_64" AND TARGET_CPU STREQUAL "x86")\r
892         ADD_PLATFORM_FLAGS("-m32 -march=i686")\r
893       ENDIF()\r
895       IF(HOST_CPU STREQUAL "x86" AND TARGET_CPU STREQUAL "x86_64")\r
896         ADD_PLATFORM_FLAGS("-m64")\r
897       ENDIF()\r
898     ENDIF()\r
900     # use c++0x standard to use std::unique_ptr and std::shared_ptr\r
901     IF(CMAKE_CXX11_EXTENSION_COMPILE_OPTION)\r
902       SET(PLATFORM_CXXFLAGS "${PLATFORM_CXXFLAGS} ${CMAKE_CXX11_EXTENSION_COMPILE_OPTION}")\r
903     ENDIF()\r
905     ADD_PLATFORM_FLAGS("-D_REENTRANT")\r
907     # hardening\r
908     ADD_PLATFORM_FLAGS("-D_FORTIFY_SOURCE=2")\r
910     IF(NOT WITH_LOW_MEMORY)\r
911       ADD_PLATFORM_FLAGS("-pipe")\r
912     ENDIF()\r
914     IF(WITH_COVERAGE)\r
915       ADD_PLATFORM_FLAGS("-fprofile-arcs -ftest-coverage")\r
916     ENDIF()\r
918     IF(WITH_WARNINGS)\r
919       ADD_PLATFORM_FLAGS("-Wall")\r
920     ELSE()\r
921       # Check wrong formats in printf-like functions\r
922       ADD_PLATFORM_FLAGS("-Wformat -Werror=format-security")\r
923     ENDIF()\r
925     # never display these warnings because they are minor\r
926     ADD_PLATFORM_FLAGS("-Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-value")\r
928     IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "6.0.0")\r
929       ADD_PLATFORM_FLAGS("-Wno-unused-local-typedefs")\r
930     ELSEIF(CLANG)\r
931       ADD_PLATFORM_FLAGS("-Wno-unused-private-field -Wno-unused-local-typedef")\r
932     ENDIF()\r
934     IF(ANDROID)\r
935       ADD_PLATFORM_FLAGS("--sysroot=${PLATFORM_ROOT}")\r
936       ADD_PLATFORM_FLAGS("-ffunction-sections -funwind-tables")\r
937       ADD_PLATFORM_FLAGS("-DANDROID")\r
938       ADD_PLATFORM_FLAGS("-Wa,--noexecstack")\r
940       IF(TARGET_ARM)\r
941         ADD_PLATFORM_FLAGS("-fpic")\r
942         ADD_PLATFORM_FLAGS("-D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__")\r
944         IF(TARGET_ARMV7)\r
945           ADD_PLATFORM_FLAGS("-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16")\r
946           ADD_PLATFORM_LINKFLAGS("-march=armv7-a -Wl,--fix-cortex-a8")\r
947         ELSEIF(TARGET_ARMV5)\r
948           ADD_PLATFORM_FLAGS("-march=armv5te -mtune=xscale -msoft-float")\r
949         ENDIF()\r
951         SET(TARGET_THUMB ON)\r
952         IF(TARGET_THUMB)\r
953           ADD_PLATFORM_FLAGS("-mthumb -finline-limit=64")\r
954           SET(DEBUG_CFLAGS "${DEBUG_CFLAGS} -marm")\r
955         ELSE()\r
956           ADD_PLATFORM_FLAGS("-funswitch-loops -finline-limit=300")\r
957         ENDIF()\r
958       ELSEIF(TARGET_X86)\r
959         # Optimizations for Intel Atom\r
960         ADD_PLATFORM_FLAGS("-march=i686 -mtune=atom -mstackrealign -msse3 -mfpmath=sse -m32 -flto -ffast-math -funroll-loops")\r
961         ADD_PLATFORM_FLAGS("-funswitch-loops -finline-limit=300")\r
962       ELSEIF(TARGET_MIPS)\r
963         ADD_PLATFORM_FLAGS("-fpic -finline-functions -fmessage-length=0 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers")\r
964         SET(RELEASE_CFLAGS "${RELEASE_CFLAGS} -funswitch-loops -finline-limit=300")\r
965       ENDIF()\r
966       ADD_PLATFORM_LINKFLAGS("-Wl,-z,noexecstack")\r
967       ADD_PLATFORM_LINKFLAGS("-L${PLATFORM_ROOT}/usr/lib")\r
968     ENDIF()\r
970     IF(APPLE)\r
971       ADD_PLATFORM_FLAGS("-gdwarf-2 -D_DARWIN_UNLIMITED_STREAMS")\r
972     ENDIF()\r
974     # Fix "relocation R_X86_64_32 against.." error on x64 platforms\r
975     IF(NOT MINGW)\r
976       ADD_PLATFORM_FLAGS("-fPIC")\r
977     ENDIF()\r
979     # hardening\r
980     ADD_PLATFORM_FLAGS("-fstack-protector --param=ssp-buffer-size=4")\r
982     # If -fstack-protector or -fstack-protector-all enabled, enable too new warnings and fix possible link problems\r
983     IF(WITH_WARNINGS)\r
984       ADD_PLATFORM_FLAGS("-Wstack-protector")\r
985     ENDIF()\r
987     # Fix undefined reference to `__stack_chk_fail' error\r
988     ADD_PLATFORM_LINKFLAGS("-lc")\r
990     IF(NOT APPLE)\r
991       ADD_PLATFORM_LINKFLAGS("-Wl,--no-undefined -Wl,--as-needed")\r
993       IF(WITH_STATIC_RUNTIMES)\r
994         ADD_PLATFORM_LINKFLAGS("-static-libstdc++")\r
995       ENDIF()\r
996     ENDIF()\r
998     IF(NOT APPLE)\r
999       # hardening\r
1000       ADD_PLATFORM_LINKFLAGS("-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now")\r
1001     ENDIF()\r
1003     IF(WITH_SYMBOLS)\r
1004       SET(NL_RELEASE_CFLAGS "${NL_RELEASE_CFLAGS} -g")\r
1005     ELSE()\r
1006       IF(APPLE)\r
1007         SET(NL_RELEASE_LINKFLAGS "-Wl,-dead_strip ${NL_RELEASE_LINKFLAGS}")\r
1008       ELSE()\r
1009         SET(NL_RELEASE_LINKFLAGS "-Wl,-s ${NL_RELEASE_LINKFLAGS}")\r
1010       ENDIF()\r
1011     ENDIF()\r
1013     SET(NL_DEBUG_CFLAGS "-g -DNL_DEBUG -D_DEBUG ${NL_DEBUG_CFLAGS}")\r
1014     SET(NL_RELEASE_CFLAGS "-DNL_RELEASE -DNDEBUG -O3 ${NL_RELEASE_CFLAGS}")\r
1015   ENDIF()\r
1016 ENDMACRO()\r
1018 MACRO(NL_SETUP_BUILD_FLAGS)\r
1019   SET(CMAKE_C_FLAGS ${PLATFORM_CFLAGS} CACHE STRING "" FORCE)\r
1020   SET(CMAKE_CXX_FLAGS ${PLATFORM_CXXFLAGS} CACHE STRING "" FORCE)\r
1021   SET(CMAKE_EXE_LINKER_FLAGS ${PLATFORM_LINKFLAGS} CACHE STRING "" FORCE)\r
1022   SET(CMAKE_MODULE_LINKER_FLAGS ${PLATFORM_LINKFLAGS} CACHE STRING "" FORCE)\r
1023   SET(CMAKE_SHARED_LINKER_FLAGS ${PLATFORM_LINKFLAGS} CACHE STRING "" FORCE)\r
1025   ## Debug\r
1026   SET(CMAKE_C_FLAGS_DEBUG ${NL_DEBUG_CFLAGS} CACHE STRING "" FORCE)\r
1027   SET(CMAKE_CXX_FLAGS_DEBUG ${NL_DEBUG_CFLAGS} CACHE STRING "" FORCE)\r
1028   SET(CMAKE_EXE_LINKER_FLAGS_DEBUG ${NL_DEBUG_LINKFLAGS} CACHE STRING "" FORCE)\r
1029   SET(CMAKE_MODULE_LINKER_FLAGS_DEBUG ${NL_DEBUG_LINKFLAGS} CACHE STRING "" FORCE)\r
1030   SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG ${NL_DEBUG_LINKFLAGS} CACHE STRING "" FORCE)\r
1032   ## Release\r
1033   SET(CMAKE_C_FLAGS_RELEASE ${NL_RELEASE_CFLAGS} CACHE STRING "" FORCE)\r
1034   SET(CMAKE_CXX_FLAGS_RELEASE ${NL_RELEASE_CFLAGS} CACHE STRING "" FORCE)\r
1035   SET(CMAKE_EXE_LINKER_FLAGS_RELEASE ${NL_RELEASE_LINKFLAGS} CACHE STRING "" FORCE)\r
1036   SET(CMAKE_MODULE_LINKER_FLAGS_RELEASE ${NL_RELEASE_LINKFLAGS} CACHE STRING "" FORCE)\r
1037   SET(CMAKE_SHARED_LINKER_FLAGS_RELEASE ${NL_RELEASE_LINKFLAGS} CACHE STRING "" FORCE)\r
1038 ENDMACRO(NL_SETUP_BUILD_FLAGS)\r
1040 # Macro to create x_ABSOLUTE_PREFIX from x_PREFIX\r
1041 MACRO(NL_MAKE_ABSOLUTE_PREFIX NAME_RELATIVE NAME_ABSOLUTE)\r
1042   IF(IS_ABSOLUTE "${${NAME_RELATIVE}}")\r
1043     SET(${NAME_ABSOLUTE} ${${NAME_RELATIVE}})\r
1044   ELSE()\r
1045     IF(WITH_UNIX_STRUCTURE)\r
1046       SET(${NAME_ABSOLUTE} ${CMAKE_INSTALL_PREFIX}/${${NAME_RELATIVE}})\r
1047     ELSE()\r
1048       SET(${NAME_ABSOLUTE} ${${NAME_RELATIVE}})\r
1049     ENDIF()\r
1050   ENDIF()\r
1051 ENDMACRO(NL_MAKE_ABSOLUTE_PREFIX)\r
1053 MACRO(NL_SETUP_PREFIX_PATHS)\r
1054   IF(TARGET_X64 AND WIN32)\r
1055     SET(LIB_SUFFIX "64")\r
1056   ELSE()\r
1057     SET(LIB_SUFFIX "")\r
1058   ENDIF()\r
1060   ## Allow override of install_prefix/etc path.\r
1061   IF(NOT NL_ETC_PREFIX)\r
1062     IF(WITH_UNIX_STRUCTURE)\r
1063       SET(NL_ETC_PREFIX "etc/nel" CACHE PATH "Installation path for configurations")\r
1064     ELSE()\r
1065       SET(NL_ETC_PREFIX "." CACHE PATH "Installation path for configurations")\r
1066     ENDIF()\r
1067   ENDIF()\r
1068   NL_MAKE_ABSOLUTE_PREFIX(NL_ETC_PREFIX NL_ETC_ABSOLUTE_PREFIX)\r
1070   ## Allow override of install_prefix/share path.\r
1071   IF(NOT NL_SHARE_PREFIX)\r
1072     IF(WITH_UNIX_STRUCTURE)\r
1073       SET(NL_SHARE_PREFIX "share/nel" CACHE PATH "Installation path for data.")\r
1074     ELSE()\r
1075       SET(NL_SHARE_PREFIX "." CACHE PATH "Installation path for data.")\r
1076     ENDIF()\r
1077   ENDIF()\r
1078   NL_MAKE_ABSOLUTE_PREFIX(NL_SHARE_PREFIX NL_SHARE_ABSOLUTE_PREFIX)\r
1080   ## Allow override of install_prefix/sbin path.\r
1081   IF(NOT NL_SBIN_PREFIX)\r
1082     IF(WITH_UNIX_STRUCTURE)\r
1083       SET(NL_SBIN_PREFIX "sbin${LIB_SUFFIX}" CACHE PATH "Installation path for admin tools and services.")\r
1084     ELSE()\r
1085       SET(NL_SBIN_PREFIX "." CACHE PATH "Installation path for admin tools and services.")\r
1086     ENDIF()\r
1087   ENDIF()\r
1088   NL_MAKE_ABSOLUTE_PREFIX(NL_SBIN_PREFIX NL_SBIN_ABSOLUTE_PREFIX)\r
1090   ## Allow override of install_prefix/bin path.\r
1091   IF(NOT NL_BIN_PREFIX)\r
1092     IF(WITH_UNIX_STRUCTURE)\r
1093       SET(NL_BIN_PREFIX "bin${LIB_SUFFIX}" CACHE PATH "Installation path for tools and applications.")\r
1094     ELSE()\r
1095       SET(NL_BIN_PREFIX "." CACHE PATH "Installation path for tools and applications.")\r
1096     ENDIF()\r
1097   ENDIF()\r
1098   NL_MAKE_ABSOLUTE_PREFIX(NL_BIN_PREFIX NL_BIN_ABSOLUTE_PREFIX)\r
1100   ## Allow override of install_prefix/lib path.\r
1101   IF(NOT NL_LIB_PREFIX)\r
1102     IF(LIBRARY_ARCHITECTURE)\r
1103       SET(NL_LIB_PREFIX "lib/${LIBRARY_ARCHITECTURE}" CACHE PATH "Installation path for libraries.")\r
1104     ELSE()\r
1105       SET(NL_LIB_PREFIX "lib${LIB_SUFFIX}" CACHE PATH "Installation path for libraries.")\r
1106     ENDIF()\r
1107   ENDIF()\r
1108   NL_MAKE_ABSOLUTE_PREFIX(NL_LIB_PREFIX NL_LIB_ABSOLUTE_PREFIX)\r
1110   ## Allow override of install_prefix/lib path.\r
1111   IF(NOT NL_DRIVER_PREFIX)\r
1112     IF(WITH_UNIX_STRUCTURE)\r
1113       IF(LIBRARY_ARCHITECTURE)\r
1114         SET(NL_DRIVER_PREFIX "lib/${LIBRARY_ARCHITECTURE}/nel" CACHE PATH "Installation path for drivers.")\r
1115       ELSE()\r
1116         IF(WIN32)\r
1117           SET(NL_DRIVER_PREFIX "bin${LIB_SUFFIX}" CACHE PATH "Installation path for drivers.")\r
1118         ELSE()\r
1119           SET(NL_DRIVER_PREFIX "lib${LIB_SUFFIX}/nel" CACHE PATH "Installation path for drivers.")\r
1120         ENDIF()\r
1121       ENDIF()\r
1122     ELSE()\r
1123       SET(NL_DRIVER_PREFIX "." CACHE PATH "Installation path for drivers.")\r
1124     ENDIF()\r
1125   ENDIF()\r
1126   NL_MAKE_ABSOLUTE_PREFIX(NL_DRIVER_PREFIX NL_DRIVER_ABSOLUTE_PREFIX)\r
1127 ENDMACRO(NL_SETUP_PREFIX_PATHS)\r
1129 MACRO(RYZOM_SETUP_PREFIX_PATHS)\r
1130   ## Allow override of install_prefix/etc path.\r
1131   IF(NOT RYZOM_ETC_PREFIX)\r
1132     IF(WITH_UNIX_STRUCTURE)\r
1133       SET(RYZOM_ETC_PREFIX "etc/ryzom" CACHE PATH "Installation path for configurations")\r
1134     ELSE()\r
1135       SET(RYZOM_ETC_PREFIX "." CACHE PATH "Installation path for configurations")\r
1136     ENDIF()\r
1137   ENDIF()\r
1138   NL_MAKE_ABSOLUTE_PREFIX(RYZOM_ETC_PREFIX RYZOM_ETC_ABSOLUTE_PREFIX)\r
1140   ## Allow override of install_prefix/share path.\r
1141   IF(NOT RYZOM_SHARE_PREFIX)\r
1142     IF(WITH_UNIX_STRUCTURE)\r
1143       SET(RYZOM_SHARE_PREFIX "share/ryzom" CACHE PATH "Installation path for data.")\r
1144     ELSE()\r
1145       SET(RYZOM_SHARE_PREFIX "." CACHE PATH "Installation path for data.")\r
1146     ENDIF()\r
1147   ENDIF()\r
1148   NL_MAKE_ABSOLUTE_PREFIX(RYZOM_SHARE_PREFIX RYZOM_SHARE_ABSOLUTE_PREFIX)\r
1150   ## Allow override of install_prefix/sbin path.\r
1151   IF(NOT RYZOM_SBIN_PREFIX)\r
1152     IF(WITH_UNIX_STRUCTURE)\r
1153       SET(RYZOM_SBIN_PREFIX "sbin${LIB_SUFFIX}" CACHE PATH "Installation path for admin tools and services.")\r
1154     ELSE()\r
1155       SET(RYZOM_SBIN_PREFIX "." CACHE PATH "Installation path for admin tools and services.")\r
1156     ENDIF()\r
1157   ENDIF()\r
1158   NL_MAKE_ABSOLUTE_PREFIX(RYZOM_SBIN_PREFIX RYZOM_SBIN_ABSOLUTE_PREFIX)\r
1160   ## Allow override of install_prefix/bin path.\r
1161   IF(NOT RYZOM_BIN_PREFIX)\r
1162     IF(WITH_UNIX_STRUCTURE)\r
1163       SET(RYZOM_BIN_PREFIX "bin${LIB_SUFFIX}" CACHE PATH "Installation path for tools.")\r
1164     ELSE()\r
1165       SET(RYZOM_BIN_PREFIX "." CACHE PATH "Installation path for tools and applications.")\r
1166     ENDIF()\r
1167   ENDIF()\r
1168   NL_MAKE_ABSOLUTE_PREFIX(RYZOM_BIN_PREFIX RYZOM_BIN_ABSOLUTE_PREFIX)\r
1170   ## Allow override of install_prefix/lib path.\r
1171   IF(NOT RYZOM_LIB_PREFIX)\r
1172     IF(LIBRARY_ARCHITECTURE)\r
1173       SET(RYZOM_LIB_PREFIX "lib/${LIBRARY_ARCHITECTURE}" CACHE PATH "Installation path for libraries.")\r
1174     ELSE()\r
1175       SET(RYZOM_LIB_PREFIX "lib${LIB_SUFFIX}" CACHE PATH "Installation path for libraries.")\r
1176     ENDIF()\r
1177   ENDIF()\r
1178   NL_MAKE_ABSOLUTE_PREFIX(RYZOM_LIB_PREFIX RYZOM_LIB_ABSOLUTE_PREFIX)\r
1180   ## Allow override of install_prefix/games path.\r
1181   IF(NOT RYZOM_GAMES_PREFIX)\r
1182     IF(WITH_UNIX_STRUCTURE)\r
1183       SET(RYZOM_GAMES_PREFIX "games" CACHE PATH "Installation path for client.")\r
1184     ELSE()\r
1185       SET(RYZOM_GAMES_PREFIX "." CACHE PATH "Installation path for tools and applications.")\r
1186     ENDIF()\r
1187   ENDIF()\r
1188   NL_MAKE_ABSOLUTE_PREFIX(RYZOM_GAMES_PREFIX RYZOM_GAMES_ABSOLUTE_PREFIX)\r
1190 ENDMACRO(RYZOM_SETUP_PREFIX_PATHS)\r
1192 MACRO(SETUP_EXTERNAL)\r
1193   IF(WITH_EXTERNAL)\r
1194     FIND_PACKAGE(External REQUIRED)\r
1195   ENDIF()\r
1197   IF(WIN32)\r
1198     FIND_PACKAGE(External REQUIRED)\r
1200     # If using custom boost, we need to define the right variables used by official boost CMake module\r
1201     IF(DEFINED BOOST_DIR)\r
1202       SET(BOOST_INCLUDEDIR ${BOOST_DIR}/include)\r
1203       SET(BOOST_LIBRARYDIR ${BOOST_DIR}/lib)\r
1204     ENDIF()\r
1205   ELSE()\r
1206     FIND_PACKAGE(External QUIET)\r
1208     IF(APPLE)\r
1209       IF(WITH_STATIC_EXTERNAL)\r
1210         # Look only for static libraries because systems libraries are using Frameworks\r
1211         SET(CMAKE_FIND_LIBRARY_SUFFIXES .a)\r
1212       ELSE()\r
1213         SET(CMAKE_FIND_LIBRARY_SUFFIXES .dylib .so .a)\r
1214       ENDIF()\r
1215     ELSE()\r
1216       IF(WITH_STATIC_EXTERNAL)\r
1217         SET(CMAKE_FIND_LIBRARY_SUFFIXES .a .so)\r
1218       ELSE()\r
1219         SET(CMAKE_FIND_LIBRARY_SUFFIXES .so .a)\r
1220       ENDIF()\r
1221     ENDIF()\r
1222   ENDIF()\r
1224   # Android, iOS and Mac OS X have pthread, but no need to link to libpthread\r
1225   IF(ANDROID OR APPLE)\r
1226     SET(CMAKE_USE_PTHREADS_INIT 1)\r
1227     SET(Threads_FOUND TRUE)\r
1228   ELSE()\r
1229     SET(THREADS_HAVE_PTHREAD_ARG ON)\r
1230     FIND_PACKAGE(Threads)\r
1231     # TODO: replace all -l<lib> by absolute path to <lib> in CMAKE_THREAD_LIBS_INIT\r
1232   ENDIF()\r
1234   IF(WITH_STLPORT)\r
1235     FIND_PACKAGE(STLport REQUIRED)\r
1236     INCLUDE_DIRECTORIES(${STLPORT_INCLUDE_DIR})\r
1237   ENDIF()\r
1239   IF(WIN32)\r
1240     # Must include DXSDK before WINSDK\r
1241     FIND_PACKAGE(DirectXSDK REQUIRED)\r
1242     # IF(DXSDK_INCLUDE_DIR)\r
1243     #   INCLUDE_DIRECTORIES(${DXSDK_INCLUDE_DIR})\r
1244     # ENDIF()\r
1245   ENDIF()\r
1247   IF(MSVC)\r
1248     FIND_PACKAGE(MSVC REQUIRED)\r
1249     FIND_PACKAGE(WindowsSDK REQUIRED)\r
1250   ENDIF()\r
1251 ENDMACRO()\r