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