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