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