Clean scaling pre-filter for formspec/HUD.
[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         guiscalingfilter.cpp
409         guiTable.cpp
410         guiVolumeChange.cpp
411         hud.cpp
412         imagefilters.cpp
413         keycode.cpp
414         localplayer.cpp
415         main.cpp
416         mapblock_mesh.cpp
417         mesh.cpp
418         particles.cpp
419         shader.cpp
420         sky.cpp
421         wieldmesh.cpp
422         ${client_SCRIPT_SRCS}
423 )
424 list(SORT client_SRCS)
425
426 # Server sources
427 set(server_SRCS
428         ${common_SRCS}
429         main.cpp
430 )
431 list(SORT server_SRCS)
432
433 include_directories(
434         ${PROJECT_BINARY_DIR}
435         ${PROJECT_SOURCE_DIR}
436         ${IRRLICHT_INCLUDE_DIR}
437         ${ZLIB_INCLUDE_DIR}
438         ${CMAKE_BUILD_TYPE}
439         ${PNG_INCLUDE_DIR}
440         ${GETTEXT_INCLUDE_DIR}
441         ${SOUND_INCLUDE_DIRS}
442         ${SQLITE3_INCLUDE_DIR}
443         ${LUA_INCLUDE_DIR}
444         ${JSON_INCLUDE_DIR}
445         ${PROJECT_SOURCE_DIR}/script
446 )
447
448
449 if(USE_FREETYPE)
450         include_directories(${FREETYPE_INCLUDE_DIRS} ${CGUITTFONT_INCLUDE_DIR})
451 endif()
452
453 if(USE_CURL)
454         include_directories(${CURL_INCLUDE_DIR})
455 endif()
456
457
458 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
459
460
461 if(BUILD_CLIENT)
462         add_executable(${PROJECT_NAME_LOWER} ${client_SRCS})
463         add_dependencies(${PROJECT_NAME_LOWER} GenerateVersion)
464         set(client_LIBS
465                 ${PROJECT_NAME_LOWER}
466                 ${ZLIB_LIBRARIES}
467                 ${IRRLICHT_LIBRARY}
468                 ${OPENGL_LIBRARIES}
469                 ${JPEG_LIBRARIES}
470                 ${BZIP2_LIBRARIES}
471                 ${PNG_LIBRARIES}
472                 ${X11_LIBRARIES}
473                 ${GETTEXT_LIBRARY}
474                 ${SOUND_LIBRARIES}
475                 ${SQLITE3_LIBRARY}
476                 ${LUA_LIBRARY}
477                 ${JSON_LIBRARY}
478                 ${OPENGLES2_LIBRARIES}
479                 ${PLATFORM_LIBS}
480                 ${CLIENT_PLATFORM_LIBS}
481         )
482         if(APPLE)
483                 target_link_libraries(
484                         ${client_LIBS}
485                         ${ICONV_LIBRARY}
486                 )
487         else()
488                 target_link_libraries(
489                         ${client_LIBS}
490                 )
491         endif()
492         if(USE_CURL)
493                 target_link_libraries(
494                         ${PROJECT_NAME_LOWER}
495                         ${CURL_LIBRARY}
496                 )
497         endif()
498         if(USE_FREETYPE)
499                 if(FREETYPE_PKGCONFIG_FOUND)
500                         set_target_properties(${PROJECT_NAME_LOWER}
501                                 PROPERTIES
502                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
503                         )
504                 endif()
505                 target_link_libraries(
506                         ${PROJECT_NAME_LOWER}
507                         ${FREETYPE_LIBRARY}
508                         ${CGUITTFONT_LIBRARY}
509                 )
510         endif()
511         if (USE_LEVELDB)
512                 target_link_libraries(${PROJECT_NAME_LOWER} ${LEVELDB_LIBRARY})
513         endif()
514         if (USE_REDIS)
515                 target_link_libraries(${PROJECT_NAME_LOWER} ${REDIS_LIBRARY})
516         endif()
517 endif(BUILD_CLIENT)
518
519
520 if(BUILD_SERVER)
521         add_executable(${PROJECT_NAME_LOWER}server ${server_SRCS})
522         add_dependencies(${PROJECT_NAME_LOWER}server GenerateVersion)
523         target_link_libraries(
524                 ${PROJECT_NAME_LOWER}server
525                 ${ZLIB_LIBRARIES}
526                 ${SQLITE3_LIBRARY}
527                 ${JSON_LIBRARY}
528                 ${GETTEXT_LIBRARY}
529                 ${LUA_LIBRARY}
530                 ${PLATFORM_LIBS}
531         )
532         set_target_properties(${PROJECT_NAME_LOWER}server PROPERTIES
533                         COMPILE_DEFINITIONS "SERVER")
534         if (USE_LEVELDB)
535                 target_link_libraries(${PROJECT_NAME_LOWER}server ${LEVELDB_LIBRARY})
536         endif()
537         if (USE_REDIS)
538                 target_link_libraries(${PROJECT_NAME_LOWER}server ${REDIS_LIBRARY})
539         endif()
540         if(USE_CURL)
541                 target_link_libraries(
542                         ${PROJECT_NAME_LOWER}server
543                         ${CURL_LIBRARY}
544                 )
545         endif()
546 endif(BUILD_SERVER)
547
548
549 # Set some optimizations and tweaks
550
551 include(CheckCXXCompilerFlag)
552
553 if(MSVC)
554         # Visual Studio
555
556         # EHa enables SEH exceptions (used for catching segfaults)
557         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")
558         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
559         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
560
561         set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
562
563         # Debug build doesn't catch exceptions by itself
564         # Add some optimizations because otherwise it's VERY slow
565         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
566
567         # Flags for C files (sqlite)
568         # /MT = Link statically with standard library stuff
569         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
570 else()
571         # Probably GCC
572         if(APPLE)
573                 SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
574         endif()
575         if(WARN_ALL)
576                 set(RELEASE_WARNING_FLAGS "-Wall")
577         else()
578                 set(RELEASE_WARNING_FLAGS "")
579         endif()
580
581         if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
582                 # clang does not understand __extern_always_inline but libc headers use it
583                 set(OTHER_FLAGS "${OTHER_FLAGS} \"-D__extern_always_inline=extern __always_inline\"")
584         endif()
585
586         if(MINGW)
587                 set(OTHER_FLAGS "-mthreads -fexceptions")
588         endif()
589
590         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops")
591         if(APPLE)
592                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
593         else()
594                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -fomit-frame-pointer")
595         endif(APPLE)
596         set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
597         set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
598
599         if(USE_GPROF)
600                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
601         endif()
602 endif()
603
604
605 # Installation
606
607 if(WIN32)
608         if(USE_SOUND)
609                 if(OPENAL_DLL)
610                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
611                 endif()
612                 if(OGG_DLL)
613                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
614                 endif()
615                 if(VORBIS_DLL)
616                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
617                 endif()
618                 if(VORBISFILE_DLL)
619                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
620                 endif()
621         endif()
622         if(CURL_DLL)
623                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
624         endif()
625         if(ZLIB_DLL)
626                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
627         endif()
628         if(ZLIBWAPI_DLL)
629                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
630         endif()
631         if(FREETYPE_DLL)
632                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
633         endif()
634         if(SQLITE3_DLL)
635                 install(FILES ${SQLITE3_DLL} DESTINATION ${BINDIR})
636         endif()
637         if(LEVELDB_DLL)
638                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
639         endif()
640 endif()
641
642 if(BUILD_CLIENT)
643         install(TARGETS ${PROJECT_NAME_LOWER}
644                 RUNTIME DESTINATION ${BINDIR}
645                 LIBRARY DESTINATION ${BINDIR}
646                 ARCHIVE DESTINATION ${BINDIR}
647                 BUNDLE DESTINATION .
648         )
649
650         if(APPLE)
651                 install(CODE "
652                         set(BU_CHMOD_BUNDLE_ITEMS ON)
653                         include(BundleUtilities)
654                         fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${BUNDLE_PATH}\" \"\" \"\${CMAKE_INSTALL_PREFIX}/${BINDIR}\")
655                 " COMPONENT Runtime)
656         endif()
657
658         if(USE_GETTEXT)
659                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
660                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
661                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME_LOWER}.mo")
662                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
663                 endforeach()
664         endif()
665
666         if(WIN32)
667                 if(DEFINED IRRLICHT_DLL)
668                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
669                 endif()
670                 if(USE_GETTEXT)
671                         if(DEFINED GETTEXT_DLL)
672                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
673                         endif()
674                         if(DEFINED GETTEXT_ICONV_DLL)
675                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
676                         endif()
677                 endif()
678         endif()
679 endif(BUILD_CLIENT)
680
681 if(BUILD_SERVER)
682         install(TARGETS ${PROJECT_NAME_LOWER}server DESTINATION ${BINDIR})
683 endif()
684
685 if (USE_GETTEXT)
686         set(MO_FILES)
687
688         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
689                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME_LOWER}.po")
690                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
691                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME_LOWER}.mo")
692
693                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
694                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
695                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
696
697                 add_custom_command(
698                         OUTPUT ${MO_FILE_PATH}
699                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
700                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
701                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
702                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
703                         )
704
705                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
706         endforeach()
707
708         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
709 endif()
710
711
712 # Subdirectories
713
714 if (BUILD_CLIENT AND USE_FREETYPE)
715         add_subdirectory(cguittfont)
716 endif()
717