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