Tests: Modularize unit testing
[oweals/minetest.git] / src / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.6)
2
3 project(Minetest)
4 string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER)
5
6 INCLUDE(CheckIncludeFiles)
7
8 # Add custom SemiDebug build mode
9 set(CMAKE_CXX_FLAGS_SEMIDEBUG "-O1 -g -Wall -Wabi" CACHE STRING
10         "Flags used by the C++ compiler during semidebug builds."
11         FORCE
12 )
13 set(CMAKE_C_FLAGS_SEMIDEBUG "-O1 -g -Wall -pedantic" CACHE STRING
14         "Flags used by the C compiler during semidebug builds."
15         FORCE
16 )
17 mark_as_advanced(
18         CMAKE_CXX_FLAGS_SEMIDEBUG
19         CMAKE_C_FLAGS_SEMIDEBUG
20 )
21 set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING
22         "Choose the type of build. Options are: None Debug SemiDebug RelWithDebInfo MinSizeRel."
23         FORCE
24 )
25
26
27 # Set some random things default to not being visible in the GUI
28 mark_as_advanced(EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH)
29
30
31 option(ENABLE_CURL "Enable cURL support for fetching media" TRUE)
32 set(USE_CURL FALSE)
33
34 if(ENABLE_CURL)
35         find_package(CURL)
36         if (CURL_FOUND)
37                 message(STATUS "cURL support enabled.")
38                 set(USE_CURL TRUE)
39         endif()
40 else()
41         mark_as_advanced(CLEAR CURL_LIBRARY CURL_INCLUDE_DIR)
42 endif()
43
44
45 option(ENABLE_GETTEXT "Use GetText for internationalization" FALSE)
46 set(USE_GETTEXT FALSE)
47
48 if(ENABLE_GETTEXT)
49         find_package(GettextLib)
50         if(GETTEXT_FOUND)
51                 if(WIN32)
52                         message(STATUS "GetText library: ${GETTEXT_LIBRARY}")
53                         message(STATUS "GetText DLL: ${GETTEXT_DLL}")
54                         message(STATUS "GetText iconv DLL: ${GETTEXT_ICONV_DLL}")
55                 endif()
56                 set(USE_GETTEXT TRUE)
57                 message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
58         endif(GETTEXT_FOUND)
59 else()
60         mark_as_advanced(GETTEXT_ICONV_DLL GETTEXT_INCLUDE_DIR GETTEXT_LIBRARY GETTEXT_MSGFMT)
61         message(STATUS "GetText disabled.")
62 endif()
63
64
65 option(ENABLE_SOUND "Enable sound" TRUE)
66 set(USE_SOUND FALSE)
67
68 if(BUILD_CLIENT AND ENABLE_SOUND)
69         # Sound libraries
70         find_package(OpenAL)
71         find_package(Vorbis)
72         if(NOT OPENAL_FOUND)
73                 message(STATUS "Sound enabled, but OpenAL not found!")
74                 mark_as_advanced(CLEAR OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
75         endif()
76         if(NOT VORBIS_FOUND)
77                 message(STATUS "Sound enabled, but Vorbis libraries not found!")
78                 mark_as_advanced(CLEAR OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)
79         endif()
80         if(OPENAL_FOUND AND VORBIS_FOUND)
81                 set(USE_SOUND TRUE)
82                 message(STATUS "Sound enabled.")
83         else()
84                 message(FATAL_ERROR "Sound enabled, but cannot be used.\n"
85                         "To continue, either fill in the required paths or disable sound. (-DENABLE_SOUND=0)")
86         endif()
87 endif()
88
89 if(USE_SOUND)
90         set(sound_SRCS sound_openal.cpp)
91         set(SOUND_INCLUDE_DIRS
92                 ${OPENAL_INCLUDE_DIR}
93                 ${VORBIS_INCLUDE_DIR}
94                 ${OGG_INCLUDE_DIR}
95                 )
96         set(SOUND_LIBRARIES
97                 ${OPENAL_LIBRARY}
98                 ${VORBIS_LIBRARIES}
99                 )
100 endif()
101
102
103 option(ENABLE_GLES "Enable OpenGL ES support" FALSE)
104 mark_as_advanced(ENABLE_GLES)
105 if(ENABLE_GLES)
106         find_package(OpenGLES2)
107 endif()
108
109
110 option(ENABLE_FREETYPE "Enable FreeType2 (TrueType fonts and basic unicode support)" TRUE)
111 set(USE_FREETYPE FALSE)
112
113 if(ENABLE_FREETYPE)
114 ##
115 ## Note: FindFreetype.cmake seems to have been fixed in recent versions of
116 ## CMake. If issues persist, re-enable this workaround specificially for the
117 ## failing platforms.
118 ##
119 #       if(UNIX)
120 #               include(FindPkgConfig)
121 #               if(PKG_CONFIG_FOUND)
122 #                       pkg_check_modules(FREETYPE QUIET freetype2)
123 #                       if(FREETYPE_FOUND)
124 #                               SET(FREETYPE_PKGCONFIG_FOUND TRUE)
125 #                               SET(FREETYPE_LIBRARY ${FREETYPE_LIBRARIES})
126 #                               # Because CMake is idiotic
127 #                               string(REPLACE ";" " " FREETYPE_CFLAGS_STR ${FREETYPE_CFLAGS})
128 #                               string(REPLACE ";" " " FREETYPE_LDFLAGS_STR ${FREETYPE_LDFLAGS})
129 #                       endif(FREETYPE_FOUND)
130 #               endif(PKG_CONFIG_FOUND)
131 #       endif(UNIX)
132 #       if(NOT FREETYPE_FOUND)
133 #               find_package(Freetype)
134 #       endif()
135         find_package(Freetype)
136         if(FREETYPE_FOUND)
137                 message(STATUS "Freetype enabled.")
138                 set(USE_FREETYPE TRUE)
139                 set(CGUITTFONT_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cguittfont")
140                 set(CGUITTFONT_LIBRARY cguittfont)
141         endif()
142 endif(ENABLE_FREETYPE)
143
144
145 find_package(Lua REQUIRED)
146
147
148 option(ENABLE_LEVELDB "Enable LevelDB backend" TRUE)
149 set(USE_LEVELDB FALSE)
150
151 if(ENABLE_LEVELDB)
152         find_library(LEVELDB_LIBRARY leveldb)
153         find_path(LEVELDB_INCLUDE_DIR db.h PATH_SUFFIXES leveldb)
154         if(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
155                 set(USE_LEVELDB TRUE)
156                 message(STATUS "LevelDB backend enabled.")
157                 include_directories(${LEVELDB_INCLUDE_DIR})
158         else()
159                 message(STATUS "LevelDB not found!")
160         endif()
161 endif(ENABLE_LEVELDB)
162
163
164 OPTION(ENABLE_REDIS "Enable Redis backend" TRUE)
165 set(USE_REDIS FALSE)
166
167 if(ENABLE_REDIS)
168         find_library(REDIS_LIBRARY hiredis)
169         find_path(REDIS_INCLUDE_DIR hiredis.h PATH_SUFFIXES hiredis)
170         if(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
171                 set(USE_REDIS TRUE)
172                 message(STATUS "Redis backend enabled.")
173                 include_directories(${REDIS_INCLUDE_DIR})
174         else(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
175                 message(STATUS "Redis not found!")
176         endif(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
177 endif(ENABLE_REDIS)
178
179
180 find_package(SQLite3 REQUIRED)
181 find_package(Json REQUIRED)
182
183
184 if(NOT MSVC)
185         set(USE_GPROF FALSE CACHE BOOL "Use -pg flag for g++")
186 endif()
187
188 # Use cmake_config.h
189 add_definitions(-DUSE_CMAKE_CONFIG_H)
190
191 if(WIN32)
192         # Windows
193         if(MSVC) # MSVC Specifics
194                 set(PLATFORM_LIBS dbghelp.lib ${PLATFORM_LIBS})
195                 # Surpress some useless warnings
196                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
197         else() # Probably MinGW = GCC
198                 set(PLATFORM_LIBS "")
199         endif()
200         set(PLATFORM_LIBS ws2_32.lib shlwapi.lib ${PLATFORM_LIBS})
201
202         # Zlib stuff
203         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
204                         CACHE PATH "Zlib include directory")
205         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
206                         CACHE FILEPATH "Path to zlibwapi.lib")
207         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
208                         CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
209         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
210                         CACHE PATH "irrlicht dir")
211         if(USE_FREETYPE)
212                 set(FREETYPE_INCLUDE_DIR_ft2build "${PROJECT_SOURCE_DIR}/../../freetype2/include/"
213                                 CACHE PATH "freetype include dir")
214                 set(FREETYPE_INCLUDE_DIR_freetype2 "${PROJECT_SOURCE_DIR}/../../freetype2/include/freetype"
215                                 CACHE PATH "freetype include dir")
216                 set(FREETYPE_LIBRARY "${PROJECT_SOURCE_DIR}/../../freetype2/objs/win32/vc2005/freetype247.lib"
217                                 CACHE FILEPATH "Path to freetype247.lib")
218         endif()
219         if(ENABLE_SOUND)
220                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
221                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
222                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
223                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
224         endif()
225 else()
226         # Unix probably
227         if(BUILD_CLIENT)
228                 find_package(X11 REQUIRED)
229                 find_package(OpenGL REQUIRED)
230                 find_package(JPEG REQUIRED)
231                 find_package(BZip2 REQUIRED)
232                 find_package(PNG REQUIRED)
233                 if(APPLE)
234                         find_library(CARBON_LIB Carbon)
235                         find_library(COCOA_LIB Cocoa)
236                         find_library(IOKIT_LIB IOKit)
237                         mark_as_advanced(
238                                 CARBON_LIB
239                                 COCOA_LIB
240                                 IOKIT_LIB
241                         )
242                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
243                 endif(APPLE)
244         endif(BUILD_CLIENT)
245         find_package(ZLIB REQUIRED)
246         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
247         if(APPLE)
248                 set(PLATFORM_LIBS "-framework CoreFoundation" ${PLATFORM_LIBS})
249         else()
250                 set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
251         endif(APPLE)
252         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
253         # This way Xxf86vm is found on OpenBSD too
254         find_library(XXF86VM_LIBRARY Xxf86vm)
255         mark_as_advanced(XXF86VM_LIBRARY)
256         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
257 endif()
258
259 check_include_files(endian.h HAVE_ENDIAN_H)
260
261 configure_file(
262         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
263         "${PROJECT_BINARY_DIR}/cmake_config.h"
264 )
265
266
267 # Add a target that always rebuilds cmake_config_githash.h
268 add_custom_target(GenerateVersion
269         COMMAND ${CMAKE_COMMAND}
270         -D "GENERATE_VERSION_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
271         -D "GENERATE_VERSION_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
272         -D "VERSION_STRING=${VERSION_STRING}"
273         -D "VERSION_EXTRA=${VERSION_EXTRA}"
274         -P "${CMAKE_SOURCE_DIR}/cmake/Modules/GenerateVersion.cmake"
275         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
276
277
278 add_subdirectory(jthread)
279 add_subdirectory(network)
280 add_subdirectory(script)
281 add_subdirectory(unittest)
282 add_subdirectory(util)
283
284 set(common_SRCS
285         ban.cpp
286         cavegen.cpp
287         clientiface.cpp
288         collision.cpp
289         content_abm.cpp
290         content_mapnode.cpp
291         content_nodemeta.cpp
292         content_sao.cpp
293         convert_json.cpp
294         craftdef.cpp
295         database-dummy.cpp
296         database-leveldb.cpp
297         database-redis.cpp
298         database-sqlite3.cpp
299         database.cpp
300         debug.cpp
301         defaultsettings.cpp
302         dungeongen.cpp
303         emerge.cpp
304         environment.cpp
305         filesys.cpp
306         genericobject.cpp
307         gettext.cpp
308         httpfetch.cpp
309         inventory.cpp
310         inventorymanager.cpp
311         itemdef.cpp
312         light.cpp
313         log.cpp
314         map.cpp
315         mapblock.cpp
316         mapgen.cpp
317         mapgen_singlenode.cpp
318         mapgen_v5.cpp
319         mapgen_v6.cpp
320         mapgen_v7.cpp
321         mapnode.cpp
322         mapsector.cpp
323         mg_biome.cpp
324         mg_decoration.cpp
325         mg_ore.cpp
326         mg_schematic.cpp
327         mods.cpp
328         nameidmapping.cpp
329         nodedef.cpp
330         nodemetadata.cpp
331         nodetimer.cpp
332         noise.cpp
333         object_properties.cpp
334         pathfinder.cpp
335         player.cpp
336         porting.cpp
337         profiler.cpp
338         quicktune.cpp
339         rollback.cpp
340         rollback_interface.cpp
341         serialization.cpp
342         server.cpp
343         serverlist.cpp
344         serverobject.cpp
345         settings.cpp
346         socket.cpp
347         sound.cpp
348         staticobject.cpp
349         subgame.cpp
350         tool.cpp
351         treegen.cpp
352         version.cpp
353         voxel.cpp
354         voxelalgorithms.cpp
355         ${common_network_SRCS}
356         ${JTHREAD_SRCS}
357         ${common_SCRIPT_SRCS}
358         ${UTIL_SRCS}
359         ${UNITTEST_SRCS}
360 )
361
362
363 # This gives us the icon and file version information
364 if(WIN32)
365         set(WINRESOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc")
366         if(MINGW)
367                 if(NOT CMAKE_RC_COMPILER)
368                         set(CMAKE_RC_COMPILER "windres.exe")
369                 endif()
370                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
371                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
372                         -i${WINRESOURCE_FILE}
373                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
374                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
375                         DEPENDS ${WINRESOURCE_FILE})
376                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
377         else(MINGW) # Probably MSVC
378                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
379         endif(MINGW)
380 endif()
381
382
383 # Client sources
384 if (BUILD_CLIENT)
385         add_subdirectory(client)
386 endif(BUILD_CLIENT)
387
388 set(client_SRCS
389         ${client_SRCS}
390         ${common_SRCS}
391         ${sound_SRCS}
392         ${client_network_SRCS}
393         camera.cpp
394         chat.cpp
395         client.cpp
396         clientmap.cpp
397         clientmedia.cpp
398         clientobject.cpp
399         clouds.cpp
400         content_cao.cpp
401         content_cso.cpp
402         content_mapblock.cpp
403         convert_json.cpp
404         drawscene.cpp
405         filecache.cpp
406         fontengine.cpp
407         game.cpp
408         guiChatConsole.cpp
409         guiEngine.cpp
410         guiFileSelectMenu.cpp
411         guiFormSpecMenu.cpp
412         guiKeyChangeMenu.cpp
413         guiPasswordChange.cpp
414         guiscalingfilter.cpp
415         guiTable.cpp
416         guiVolumeChange.cpp
417         hud.cpp
418         imagefilters.cpp
419         keycode.cpp
420         localplayer.cpp
421         main.cpp
422         mapblock_mesh.cpp
423         mesh.cpp
424         particles.cpp
425         shader.cpp
426         sky.cpp
427         wieldmesh.cpp
428         ${client_SCRIPT_SRCS}
429 )
430 list(SORT client_SRCS)
431
432 # Server sources
433 set(server_SRCS
434         ${common_SRCS}
435         main.cpp
436 )
437 list(SORT server_SRCS)
438
439 include_directories(
440         ${PROJECT_BINARY_DIR}
441         ${PROJECT_SOURCE_DIR}
442         ${IRRLICHT_INCLUDE_DIR}
443         ${ZLIB_INCLUDE_DIR}
444         ${CMAKE_BUILD_TYPE}
445         ${PNG_INCLUDE_DIR}
446         ${GETTEXT_INCLUDE_DIR}
447         ${SOUND_INCLUDE_DIRS}
448         ${SQLITE3_INCLUDE_DIR}
449         ${LUA_INCLUDE_DIR}
450         ${JSON_INCLUDE_DIR}
451         ${PROJECT_SOURCE_DIR}/script
452 )
453
454
455 if(USE_FREETYPE)
456         include_directories(${FREETYPE_INCLUDE_DIRS} ${CGUITTFONT_INCLUDE_DIR})
457 endif()
458
459 if(USE_CURL)
460         include_directories(${CURL_INCLUDE_DIR})
461 endif()
462
463
464 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
465
466
467 if(BUILD_CLIENT)
468         add_executable(${PROJECT_NAME_LOWER} ${client_SRCS})
469         add_dependencies(${PROJECT_NAME_LOWER} GenerateVersion)
470         set(client_LIBS
471                 ${PROJECT_NAME_LOWER}
472                 ${ZLIB_LIBRARIES}
473                 ${IRRLICHT_LIBRARY}
474                 ${OPENGL_LIBRARIES}
475                 ${JPEG_LIBRARIES}
476                 ${BZIP2_LIBRARIES}
477                 ${PNG_LIBRARIES}
478                 ${X11_LIBRARIES}
479                 ${GETTEXT_LIBRARY}
480                 ${SOUND_LIBRARIES}
481                 ${SQLITE3_LIBRARY}
482                 ${LUA_LIBRARY}
483                 ${JSON_LIBRARY}
484                 ${OPENGLES2_LIBRARIES}
485                 ${PLATFORM_LIBS}
486                 ${CLIENT_PLATFORM_LIBS}
487         )
488         if(APPLE)
489                 target_link_libraries(
490                         ${client_LIBS}
491                         ${ICONV_LIBRARY}
492                 )
493         else()
494                 target_link_libraries(
495                         ${client_LIBS}
496                 )
497         endif()
498         if(USE_CURL)
499                 target_link_libraries(
500                         ${PROJECT_NAME_LOWER}
501                         ${CURL_LIBRARY}
502                 )
503         endif()
504         if(USE_FREETYPE)
505                 if(FREETYPE_PKGCONFIG_FOUND)
506                         set_target_properties(${PROJECT_NAME_LOWER}
507                                 PROPERTIES
508                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
509                         )
510                 endif()
511                 target_link_libraries(
512                         ${PROJECT_NAME_LOWER}
513                         ${FREETYPE_LIBRARY}
514                         ${CGUITTFONT_LIBRARY}
515                 )
516         endif()
517         if (USE_LEVELDB)
518                 target_link_libraries(${PROJECT_NAME_LOWER} ${LEVELDB_LIBRARY})
519         endif()
520         if (USE_REDIS)
521                 target_link_libraries(${PROJECT_NAME_LOWER} ${REDIS_LIBRARY})
522         endif()
523 endif(BUILD_CLIENT)
524
525
526 if(BUILD_SERVER)
527         add_executable(${PROJECT_NAME_LOWER}server ${server_SRCS})
528         add_dependencies(${PROJECT_NAME_LOWER}server GenerateVersion)
529         target_link_libraries(
530                 ${PROJECT_NAME_LOWER}server
531                 ${ZLIB_LIBRARIES}
532                 ${SQLITE3_LIBRARY}
533                 ${JSON_LIBRARY}
534                 ${GETTEXT_LIBRARY}
535                 ${LUA_LIBRARY}
536                 ${PLATFORM_LIBS}
537         )
538         set_target_properties(${PROJECT_NAME_LOWER}server PROPERTIES
539                         COMPILE_DEFINITIONS "SERVER")
540         if (USE_LEVELDB)
541                 target_link_libraries(${PROJECT_NAME_LOWER}server ${LEVELDB_LIBRARY})
542         endif()
543         if (USE_REDIS)
544                 target_link_libraries(${PROJECT_NAME_LOWER}server ${REDIS_LIBRARY})
545         endif()
546         if(USE_CURL)
547                 target_link_libraries(
548                         ${PROJECT_NAME_LOWER}server
549                         ${CURL_LIBRARY}
550                 )
551         endif()
552 endif(BUILD_SERVER)
553
554
555 # Set some optimizations and tweaks
556
557 include(CheckCXXCompilerFlag)
558
559 if(MSVC)
560         # Visual Studio
561
562         # EHa enables SEH exceptions (used for catching segfaults)
563         set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /Ob2 /Oi /Ot /Oy /GL /FD /MT /GS- /arch:SSE /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
564         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
565         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
566
567         set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
568
569         # Debug build doesn't catch exceptions by itself
570         # Add some optimizations because otherwise it's VERY slow
571         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
572
573         # Flags for C files (sqlite)
574         # /MT = Link statically with standard library stuff
575         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
576 else()
577         # Probably GCC
578         if(APPLE)
579                 SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
580         endif()
581         if(WARN_ALL)
582                 set(RELEASE_WARNING_FLAGS "-Wall")
583         else()
584                 set(RELEASE_WARNING_FLAGS "")
585         endif()
586
587         if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
588                 # clang does not understand __extern_always_inline but libc headers use it
589                 set(OTHER_FLAGS "${OTHER_FLAGS} \"-D__extern_always_inline=extern __always_inline\"")
590         endif()
591
592         if(MINGW)
593                 set(OTHER_FLAGS "-mthreads -fexceptions")
594         endif()
595
596         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops")
597         if(APPLE)
598                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
599         else()
600                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -fomit-frame-pointer")
601         endif(APPLE)
602         set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
603         set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
604
605         if(USE_GPROF)
606                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
607         endif()
608 endif()
609
610
611 # Installation
612
613 if(WIN32)
614         if(USE_SOUND)
615                 if(OPENAL_DLL)
616                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
617                 endif()
618                 if(OGG_DLL)
619                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
620                 endif()
621                 if(VORBIS_DLL)
622                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
623                 endif()
624                 if(VORBISFILE_DLL)
625                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
626                 endif()
627         endif()
628         if(CURL_DLL)
629                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
630         endif()
631         if(ZLIB_DLL)
632                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
633         endif()
634         if(ZLIBWAPI_DLL)
635                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
636         endif()
637         if(FREETYPE_DLL)
638                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
639         endif()
640         if(SQLITE3_DLL)
641                 install(FILES ${SQLITE3_DLL} DESTINATION ${BINDIR})
642         endif()
643         if(LEVELDB_DLL)
644                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
645         endif()
646 endif()
647
648 if(BUILD_CLIENT)
649         install(TARGETS ${PROJECT_NAME_LOWER}
650                 RUNTIME DESTINATION ${BINDIR}
651                 LIBRARY DESTINATION ${BINDIR}
652                 ARCHIVE DESTINATION ${BINDIR}
653                 BUNDLE DESTINATION .
654         )
655
656         if(APPLE)
657                 install(CODE "
658                         set(BU_CHMOD_BUNDLE_ITEMS ON)
659                         include(BundleUtilities)
660                         fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${BUNDLE_PATH}\" \"\" \"\${CMAKE_INSTALL_PREFIX}/${BINDIR}\")
661                 " COMPONENT Runtime)
662         endif()
663
664         if(USE_GETTEXT)
665                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
666                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
667                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME_LOWER}.mo")
668                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
669                 endforeach()
670         endif()
671
672         if(WIN32)
673                 if(DEFINED IRRLICHT_DLL)
674                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
675                 endif()
676                 if(USE_GETTEXT)
677                         if(DEFINED GETTEXT_DLL)
678                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
679                         endif()
680                         if(DEFINED GETTEXT_ICONV_DLL)
681                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
682                         endif()
683                 endif()
684         endif()
685 endif(BUILD_CLIENT)
686
687 if(BUILD_SERVER)
688         install(TARGETS ${PROJECT_NAME_LOWER}server DESTINATION ${BINDIR})
689 endif()
690
691 if (USE_GETTEXT)
692         set(MO_FILES)
693
694         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
695                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME_LOWER}.po")
696                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
697                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME_LOWER}.mo")
698
699                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
700                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
701                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
702
703                 add_custom_command(
704                         OUTPUT ${MO_FILE_PATH}
705                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
706                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
707                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
708                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
709                         )
710
711                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
712         endforeach()
713
714         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
715 endif()
716
717
718 # Subdirectories
719
720 if (BUILD_CLIENT AND USE_FREETYPE)
721         add_subdirectory(cguittfont)
722 endif()
723