Split ObjDef/ObjDefManager out to objdef.cpp
[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 find_package(GMP REQUIRED)
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 "DEVELOPMENT_BUILD=${DEVELOPMENT_BUILD}"
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         objdef.cpp
334         object_properties.cpp
335         pathfinder.cpp
336         player.cpp
337         porting.cpp
338         profiler.cpp
339         quicktune.cpp
340         rollback.cpp
341         rollback_interface.cpp
342         serialization.cpp
343         server.cpp
344         serverlist.cpp
345         serverobject.cpp
346         settings.cpp
347         socket.cpp
348         sound.cpp
349         staticobject.cpp
350         subgame.cpp
351         tool.cpp
352         treegen.cpp
353         version.cpp
354         voxel.cpp
355         voxelalgorithms.cpp
356         ${common_network_SRCS}
357         ${JTHREAD_SRCS}
358         ${common_SCRIPT_SRCS}
359         ${UTIL_SRCS}
360         ${UNITTEST_SRCS}
361 )
362
363
364 # This gives us the icon and file version information
365 if(WIN32)
366         set(WINRESOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc")
367         if(MINGW)
368                 if(NOT CMAKE_RC_COMPILER)
369                         set(CMAKE_RC_COMPILER "windres.exe")
370                 endif()
371                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
372                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
373                         -i${WINRESOURCE_FILE}
374                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
375                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
376                         DEPENDS ${WINRESOURCE_FILE})
377                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
378         else(MINGW) # Probably MSVC
379                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
380         endif(MINGW)
381 endif()
382
383
384 # Client sources
385 if (BUILD_CLIENT)
386         add_subdirectory(client)
387 endif(BUILD_CLIENT)
388
389 set(client_SRCS
390         ${client_SRCS}
391         ${common_SRCS}
392         ${sound_SRCS}
393         ${client_network_SRCS}
394         camera.cpp
395         chat.cpp
396         client.cpp
397         clientmap.cpp
398         clientmedia.cpp
399         clientobject.cpp
400         clouds.cpp
401         content_cao.cpp
402         content_cso.cpp
403         content_mapblock.cpp
404         convert_json.cpp
405         drawscene.cpp
406         filecache.cpp
407         fontengine.cpp
408         game.cpp
409         guiChatConsole.cpp
410         guiEngine.cpp
411         guiFileSelectMenu.cpp
412         guiFormSpecMenu.cpp
413         guiKeyChangeMenu.cpp
414         guiPasswordChange.cpp
415         guiscalingfilter.cpp
416         guiTable.cpp
417         guiVolumeChange.cpp
418         hud.cpp
419         imagefilters.cpp
420         keycode.cpp
421         localplayer.cpp
422         main.cpp
423         mapblock_mesh.cpp
424         mesh.cpp
425         particles.cpp
426         shader.cpp
427         sky.cpp
428         wieldmesh.cpp
429         ${client_SCRIPT_SRCS}
430 )
431 list(SORT client_SRCS)
432
433 # Server sources
434 set(server_SRCS
435         ${common_SRCS}
436         main.cpp
437 )
438 list(SORT server_SRCS)
439
440 include_directories(
441         ${PROJECT_BINARY_DIR}
442         ${PROJECT_SOURCE_DIR}
443         ${IRRLICHT_INCLUDE_DIR}
444         ${ZLIB_INCLUDE_DIR}
445         ${CMAKE_BUILD_TYPE}
446         ${PNG_INCLUDE_DIR}
447         ${GETTEXT_INCLUDE_DIR}
448         ${SOUND_INCLUDE_DIRS}
449         ${SQLITE3_INCLUDE_DIR}
450         ${LUA_INCLUDE_DIR}
451         ${GMP_INCLUDE_DIR}
452         ${JSON_INCLUDE_DIR}
453         ${PROJECT_SOURCE_DIR}/script
454 )
455
456
457 if(USE_FREETYPE)
458         include_directories(${FREETYPE_INCLUDE_DIRS} ${CGUITTFONT_INCLUDE_DIR})
459 endif()
460
461 if(USE_CURL)
462         include_directories(${CURL_INCLUDE_DIR})
463 endif()
464
465
466 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
467
468
469 if(BUILD_CLIENT)
470         add_executable(${PROJECT_NAME} ${client_SRCS})
471         add_dependencies(${PROJECT_NAME} GenerateVersion)
472         set(client_LIBS
473                 ${PROJECT_NAME}
474                 ${ZLIB_LIBRARIES}
475                 ${IRRLICHT_LIBRARY}
476                 ${OPENGL_LIBRARIES}
477                 ${JPEG_LIBRARIES}
478                 ${BZIP2_LIBRARIES}
479                 ${PNG_LIBRARIES}
480                 ${X11_LIBRARIES}
481                 ${GETTEXT_LIBRARY}
482                 ${SOUND_LIBRARIES}
483                 ${SQLITE3_LIBRARY}
484                 ${LUA_LIBRARY}
485                 ${GMP_LIBRARY}
486                 ${JSON_LIBRARY}
487                 ${OPENGLES2_LIBRARIES}
488                 ${PLATFORM_LIBS}
489                 ${CLIENT_PLATFORM_LIBS}
490         )
491         if(APPLE)
492                 target_link_libraries(
493                         ${client_LIBS}
494                         ${ICONV_LIBRARY}
495                 )
496         else()
497                 target_link_libraries(
498                         ${client_LIBS}
499                 )
500         endif()
501         if(USE_CURL)
502                 target_link_libraries(
503                         ${PROJECT_NAME}
504                         ${CURL_LIBRARY}
505                 )
506         endif()
507         if(USE_FREETYPE)
508                 if(FREETYPE_PKGCONFIG_FOUND)
509                         set_target_properties(${PROJECT_NAME}
510                                 PROPERTIES
511                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
512                         )
513                 endif()
514                 target_link_libraries(
515                         ${PROJECT_NAME}
516                         ${FREETYPE_LIBRARY}
517                         ${CGUITTFONT_LIBRARY}
518                 )
519         endif()
520         if (USE_LEVELDB)
521                 target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
522         endif()
523         if (USE_REDIS)
524                 target_link_libraries(${PROJECT_NAME} ${REDIS_LIBRARY})
525         endif()
526 endif(BUILD_CLIENT)
527
528
529 if(BUILD_SERVER)
530         add_executable(${PROJECT_NAME}server ${server_SRCS})
531         add_dependencies(${PROJECT_NAME}server GenerateVersion)
532         target_link_libraries(
533                 ${PROJECT_NAME}server
534                 ${ZLIB_LIBRARIES}
535                 ${SQLITE3_LIBRARY}
536                 ${JSON_LIBRARY}
537                 ${GETTEXT_LIBRARY}
538                 ${LUA_LIBRARY}
539                 ${GMP_LIBRARY}
540                 ${PLATFORM_LIBS}
541         )
542         set_target_properties(${PROJECT_NAME}server PROPERTIES
543                         COMPILE_DEFINITIONS "SERVER")
544         if (USE_LEVELDB)
545                 target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
546         endif()
547         if (USE_REDIS)
548                 target_link_libraries(${PROJECT_NAME}server ${REDIS_LIBRARY})
549         endif()
550         if(USE_CURL)
551                 target_link_libraries(
552                         ${PROJECT_NAME}server
553                         ${CURL_LIBRARY}
554                 )
555         endif()
556 endif(BUILD_SERVER)
557
558
559 # Set some optimizations and tweaks
560
561 include(CheckCXXCompilerFlag)
562
563 if(MSVC)
564         # Visual Studio
565
566         # EHa enables SEH exceptions (used for catching segfaults)
567         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")
568         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
569         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
570
571         set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
572
573         # Debug build doesn't catch exceptions by itself
574         # Add some optimizations because otherwise it's VERY slow
575         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
576
577         # Flags for C files (sqlite)
578         # /MT = Link statically with standard library stuff
579         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
580 else()
581         # Probably GCC
582         if(APPLE)
583                 SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
584         endif()
585         if(WARN_ALL)
586                 set(RELEASE_WARNING_FLAGS "-Wall")
587         else()
588                 set(RELEASE_WARNING_FLAGS "")
589         endif()
590
591         if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
592                 # clang does not understand __extern_always_inline but libc headers use it
593                 set(OTHER_FLAGS "${OTHER_FLAGS} \"-D__extern_always_inline=extern __always_inline\"")
594                 set(OTHER_FLAGS "${OTHER_FLAGS} -Wsign-compare")
595         endif()
596
597         if(MINGW)
598                 set(OTHER_FLAGS "-mthreads -fexceptions")
599         endif()
600
601         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops")
602         if(APPLE)
603                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
604         else()
605                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -fomit-frame-pointer")
606         endif(APPLE)
607         set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
608         set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
609
610         if(USE_GPROF)
611                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
612         endif()
613 endif()
614
615
616 # Installation
617
618 if(WIN32)
619         if(USE_SOUND)
620                 if(OPENAL_DLL)
621                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
622                 endif()
623                 if(OGG_DLL)
624                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
625                 endif()
626                 if(VORBIS_DLL)
627                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
628                 endif()
629                 if(VORBISFILE_DLL)
630                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
631                 endif()
632         endif()
633         if(CURL_DLL)
634                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
635         endif()
636         if(ZLIB_DLL)
637                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
638         endif()
639         if(ZLIBWAPI_DLL)
640                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
641         endif()
642         if(FREETYPE_DLL)
643                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
644         endif()
645         if(SQLITE3_DLL)
646                 install(FILES ${SQLITE3_DLL} DESTINATION ${BINDIR})
647         endif()
648         if(LEVELDB_DLL)
649                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
650         endif()
651 endif()
652
653 if(BUILD_CLIENT)
654         install(TARGETS ${PROJECT_NAME}
655                 RUNTIME DESTINATION ${BINDIR}
656                 LIBRARY DESTINATION ${BINDIR}
657                 ARCHIVE DESTINATION ${BINDIR}
658                 BUNDLE DESTINATION .
659         )
660
661         if(APPLE)
662                 install(CODE "
663                         set(BU_CHMOD_BUNDLE_ITEMS ON)
664                         include(BundleUtilities)
665                         fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${BUNDLE_PATH}\" \"\" \"\${CMAKE_INSTALL_PREFIX}/${BINDIR}\")
666                 " COMPONENT Runtime)
667         endif()
668
669         if(USE_GETTEXT)
670                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
671                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
672                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
673                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
674                 endforeach()
675         endif()
676
677         if(WIN32)
678                 if(DEFINED IRRLICHT_DLL)
679                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
680                 endif()
681                 if(USE_GETTEXT)
682                         if(DEFINED GETTEXT_DLL)
683                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
684                         endif()
685                         if(DEFINED GETTEXT_ICONV_DLL)
686                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
687                         endif()
688                 endif()
689         endif()
690 endif(BUILD_CLIENT)
691
692 if(BUILD_SERVER)
693         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
694 endif()
695
696 if (USE_GETTEXT)
697         set(MO_FILES)
698
699         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
700                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME}.po")
701                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
702                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
703
704                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
705                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
706                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
707
708                 add_custom_command(
709                         OUTPUT ${MO_FILE_PATH}
710                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
711                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
712                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
713                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
714                         )
715
716                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
717         endforeach()
718
719         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
720 endif()
721
722
723 # Subdirectories
724
725 if (BUILD_CLIENT AND USE_FREETYPE)
726         add_subdirectory(cguittfont)
727 endif()
728