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