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