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