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