]> git.lizzy.rs Git - dragonfireclient.git/blob - src/CMakeLists.txt
Implement mod communication channels (#6351)
[dragonfireclient.git] / src / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.6)
2
3 project(minetest)
4
5 INCLUDE(CheckIncludeFiles)
6 INCLUDE(CheckLibraryExists)
7
8 # Add custom SemiDebug build mode
9 set(CMAKE_CXX_FLAGS_SEMIDEBUG "-O1 -g -Wall -Wabi" CACHE STRING
10         "Flags used by the C++ compiler during semidebug builds."
11         FORCE
12 )
13 set(CMAKE_C_FLAGS_SEMIDEBUG "-O1 -g -Wall -pedantic" CACHE STRING
14         "Flags used by the C compiler during semidebug builds."
15         FORCE
16 )
17 mark_as_advanced(
18         CMAKE_CXX_FLAGS_SEMIDEBUG
19         CMAKE_C_FLAGS_SEMIDEBUG
20 )
21 set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING
22         "Choose the type of build. Options are: None Debug SemiDebug RelWithDebInfo MinSizeRel."
23         FORCE
24 )
25
26
27 # Set some random things default to not being visible in the GUI
28 mark_as_advanced(EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH)
29
30
31 if(NOT (BUILD_CLIENT OR BUILD_SERVER))
32         message(WARNING "Neither BUILD_CLIENT nor BUILD_SERVER is set! Setting BUILD_SERVER=true")
33         set(BUILD_SERVER TRUE)
34 endif()
35
36
37 option(ENABLE_CURL "Enable cURL support for fetching media" TRUE)
38 set(USE_CURL FALSE)
39
40 if(ENABLE_CURL)
41         find_package(CURL)
42         if (CURL_FOUND)
43                 message(STATUS "cURL support enabled.")
44                 set(USE_CURL TRUE)
45         endif()
46 else()
47         mark_as_advanced(CLEAR CURL_LIBRARY CURL_INCLUDE_DIR)
48 endif()
49
50 if(NOT USE_CURL)
51         if(BUILD_CLIENT)
52                 message(WARNING "cURL is required to load the server list")
53         endif()
54         if(BUILD_SERVER)
55                 message(WARNING "cURL is required to announce to the server list")
56         endif()
57 endif()
58
59
60 option(ENABLE_GETTEXT "Use GetText for internationalization" FALSE)
61 set(USE_GETTEXT FALSE)
62
63 if(ENABLE_GETTEXT)
64         find_package(GettextLib)
65         if(GETTEXT_FOUND)
66                 if(WIN32)
67                         message(STATUS "GetText library: ${GETTEXT_LIBRARY}")
68                         message(STATUS "GetText DLL: ${GETTEXT_DLL}")
69                         message(STATUS "GetText iconv DLL: ${GETTEXT_ICONV_DLL}")
70                 endif()
71                 set(USE_GETTEXT TRUE)
72                 message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
73         endif(GETTEXT_FOUND)
74 else()
75         mark_as_advanced(GETTEXT_ICONV_DLL GETTEXT_INCLUDE_DIR GETTEXT_LIBRARY GETTEXT_MSGFMT)
76         message(STATUS "GetText disabled.")
77 endif()
78
79
80 option(ENABLE_SOUND "Enable sound" TRUE)
81 set(USE_SOUND FALSE)
82
83 if(BUILD_CLIENT AND ENABLE_SOUND)
84         # Sound libraries
85         find_package(OpenAL)
86         find_package(Vorbis)
87         if(NOT OPENAL_FOUND)
88                 message(STATUS "Sound enabled, but OpenAL not found!")
89                 mark_as_advanced(CLEAR OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
90         endif()
91         if(NOT VORBIS_FOUND)
92                 message(STATUS "Sound enabled, but Vorbis libraries not found!")
93                 mark_as_advanced(CLEAR OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)
94         endif()
95         if(OPENAL_FOUND AND VORBIS_FOUND)
96                 set(USE_SOUND TRUE)
97                 message(STATUS "Sound enabled.")
98         else()
99                 message(FATAL_ERROR "Sound enabled, but cannot be used.\n"
100                         "To continue, either fill in the required paths or disable sound. (-DENABLE_SOUND=0)")
101         endif()
102 endif()
103
104 if(USE_SOUND)
105         set(sound_SRCS sound_openal.cpp)
106         set(SOUND_INCLUDE_DIRS
107                 ${OPENAL_INCLUDE_DIR}
108                 ${VORBIS_INCLUDE_DIR}
109                 ${OGG_INCLUDE_DIR}
110                 )
111         set(SOUND_LIBRARIES
112                 ${OPENAL_LIBRARY}
113                 ${VORBIS_LIBRARIES}
114                 )
115 endif()
116
117
118 option(ENABLE_GLES "Enable OpenGL ES support" FALSE)
119 mark_as_advanced(ENABLE_GLES)
120 if(ENABLE_GLES)
121         find_package(OpenGLES2)
122 endif()
123
124
125 option(ENABLE_FREETYPE "Enable FreeType2 (TrueType fonts and basic unicode support)" TRUE)
126 set(USE_FREETYPE FALSE)
127
128 if(ENABLE_FREETYPE)
129 ##
130 ## Note: FindFreetype.cmake seems to have been fixed in recent versions of
131 ## CMake. If issues persist, re-enable this workaround specificially for the
132 ## failing platforms.
133 ##
134 #       if(UNIX)
135 #               include(FindPkgConfig)
136 #               if(PKG_CONFIG_FOUND)
137 #                       pkg_check_modules(FREETYPE QUIET freetype2)
138 #                       if(FREETYPE_FOUND)
139 #                               SET(FREETYPE_PKGCONFIG_FOUND TRUE)
140 #                               SET(FREETYPE_LIBRARY ${FREETYPE_LIBRARIES})
141 #                               # Because CMake is idiotic
142 #                               string(REPLACE ";" " " FREETYPE_CFLAGS_STR ${FREETYPE_CFLAGS})
143 #                               string(REPLACE ";" " " FREETYPE_LDFLAGS_STR ${FREETYPE_LDFLAGS})
144 #                       endif(FREETYPE_FOUND)
145 #               endif(PKG_CONFIG_FOUND)
146 #       endif(UNIX)
147 #       if(NOT FREETYPE_FOUND)
148 #               find_package(Freetype)
149 #       endif()
150         find_package(Freetype)
151         if(FREETYPE_FOUND)
152                 message(STATUS "Freetype enabled.")
153                 set(USE_FREETYPE TRUE)
154         endif()
155 endif(ENABLE_FREETYPE)
156
157 option(ENABLE_CURSES "Enable ncurses console" TRUE)
158 set(USE_CURSES FALSE)
159
160 if(ENABLE_CURSES)
161         find_package(Ncursesw)
162         if(CURSES_FOUND)
163                 set(USE_CURSES TRUE)
164                 message(STATUS "ncurses console enabled.")
165                 include_directories(${CURSES_INCLUDE_DIRS})
166         else()
167                 message(STATUS "ncurses not found!")
168         endif()
169 endif(ENABLE_CURSES)
170
171 option(ENABLE_POSTGRESQL "Enable PostgreSQL backend" TRUE)
172 set(USE_POSTGRESQL FALSE)
173
174 if(ENABLE_POSTGRESQL)
175         find_program(POSTGRESQL_CONFIG_EXECUTABLE pg_config DOC "pg_config")
176         find_library(POSTGRESQL_LIBRARY pq)
177         if(POSTGRESQL_CONFIG_EXECUTABLE)
178                 execute_process(COMMAND ${POSTGRESQL_CONFIG_EXECUTABLE} --includedir-server
179                         OUTPUT_VARIABLE POSTGRESQL_SERVER_INCLUDE_DIRS
180                         OUTPUT_STRIP_TRAILING_WHITESPACE)
181                 execute_process(COMMAND ${POSTGRESQL_CONFIG_EXECUTABLE}
182                         OUTPUT_VARIABLE POSTGRESQL_CLIENT_INCLUDE_DIRS
183                         OUTPUT_STRIP_TRAILING_WHITESPACE)
184                 # This variable is case sensitive for the cmake PostgreSQL module
185                 set(PostgreSQL_ADDITIONAL_SEARCH_PATHS ${POSTGRESQL_SERVER_INCLUDE_DIRS} ${POSTGRESQL_CLIENT_INCLUDE_DIRS})
186         endif()
187
188         find_package("PostgreSQL")
189
190         if(POSTGRESQL_FOUND)
191                 set(USE_POSTGRESQL TRUE)
192                 message(STATUS "PostgreSQL backend enabled")
193                 # This variable is case sensitive, don't try to change it to POSTGRESQL_INCLUDE_DIR
194                 message(STATUS "PostgreSQL includes: ${PostgreSQL_INCLUDE_DIR}")
195                 include_directories(${PostgreSQL_INCLUDE_DIR})
196         else()
197                 message(STATUS "PostgreSQL not found!")
198         endif()
199 endif(ENABLE_POSTGRESQL)
200
201 option(ENABLE_LEVELDB "Enable LevelDB backend" TRUE)
202 set(USE_LEVELDB FALSE)
203
204 if(ENABLE_LEVELDB)
205         find_library(LEVELDB_LIBRARY leveldb)
206         find_path(LEVELDB_INCLUDE_DIR db.h PATH_SUFFIXES leveldb)
207         if(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
208                 set(USE_LEVELDB TRUE)
209                 message(STATUS "LevelDB backend enabled.")
210                 include_directories(${LEVELDB_INCLUDE_DIR})
211         else()
212                 message(STATUS "LevelDB not found!")
213         endif()
214 endif(ENABLE_LEVELDB)
215
216
217 OPTION(ENABLE_REDIS "Enable Redis backend" TRUE)
218 set(USE_REDIS FALSE)
219
220 if(ENABLE_REDIS)
221         find_library(REDIS_LIBRARY hiredis)
222         find_path(REDIS_INCLUDE_DIR hiredis.h PATH_SUFFIXES hiredis)
223         if(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
224                 set(USE_REDIS TRUE)
225                 message(STATUS "Redis backend enabled.")
226                 include_directories(${REDIS_INCLUDE_DIR})
227         else(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
228                 message(STATUS "Redis not found!")
229         endif(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
230 endif(ENABLE_REDIS)
231
232
233 find_package(SQLite3 REQUIRED)
234
235 OPTION(ENABLE_SPATIAL "Enable SpatialIndex AreaStore backend" TRUE)
236 set(USE_SPATIAL FALSE)
237
238 if(ENABLE_SPATIAL)
239         find_library(SPATIAL_LIBRARY spatialindex)
240         find_path(SPATIAL_INCLUDE_DIR spatialindex/SpatialIndex.h)
241         if(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
242                 set(USE_SPATIAL TRUE)
243                 message(STATUS "SpatialIndex AreaStore backend enabled.")
244                 include_directories(${SPATIAL_INCLUDE_DIR})
245         else(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
246                 message(STATUS "SpatialIndex not found!")
247         endif(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
248 endif(ENABLE_SPATIAL)
249
250
251 if(NOT MSVC)
252         set(USE_GPROF FALSE CACHE BOOL "Use -pg flag for g++")
253 endif()
254
255 # Use cmake_config.h
256 add_definitions(-DUSE_CMAKE_CONFIG_H)
257
258 if(WIN32)
259         # Windows
260         if(MSVC) # MSVC Specifics
261                 set(PLATFORM_LIBS dbghelp.lib ${PLATFORM_LIBS})
262                 # Surpress some useless warnings
263                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
264                 # Get M_PI to work
265                 add_definitions(/D "_USE_MATH_DEFINES")
266                 # Dont define min/max macros in minwindef.h
267                 add_definitions(/D "NOMINMAX")
268         else() # Probably MinGW = GCC
269                 set(PLATFORM_LIBS "")
270         endif()
271         set(PLATFORM_LIBS ws2_32.lib shlwapi.lib ${PLATFORM_LIBS})
272
273         # Zlib stuff
274         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
275                         CACHE PATH "Zlib include directory")
276         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
277                         CACHE FILEPATH "Path to zlib library (usually zlibwapi.lib)")
278         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
279                         CACHE FILEPATH "Path to zlib DLL (for installation)")
280         set(ZLIBWAPI_DLL "" CACHE FILEPATH "Path to zlibwapi DLL")
281         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
282                         CACHE PATH "irrlicht dir")
283         if(USE_FREETYPE)
284                 set(FREETYPE_INCLUDE_DIR_ft2build "${PROJECT_SOURCE_DIR}/../../freetype2/include/"
285                                 CACHE PATH "freetype include dir")
286                 set(FREETYPE_INCLUDE_DIR_freetype2 "${PROJECT_SOURCE_DIR}/../../freetype2/include/freetype"
287                                 CACHE PATH "freetype include dir")
288                 set(FREETYPE_LIBRARY "${PROJECT_SOURCE_DIR}/../../freetype2/objs/win32/vc2005/freetype247.lib"
289                                 CACHE FILEPATH "Path to freetype247.lib")
290         endif()
291         if(ENABLE_SOUND)
292                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
293                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
294                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
295                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
296         endif()
297         if(USE_LUAJIT)
298                 set(LUA_DLL "" CACHE FILEPATH "Path to lua51.dll for installation (optional)")
299         endif()
300 else()
301         # Unix probably
302         if(BUILD_CLIENT)
303                 find_package(X11 REQUIRED)
304                 find_package(OpenGL REQUIRED)
305                 find_package(JPEG REQUIRED)
306                 find_package(BZip2 REQUIRED)
307                 find_package(PNG REQUIRED)
308                 if(APPLE)
309                         find_library(CARBON_LIB Carbon)
310                         find_library(COCOA_LIB Cocoa)
311                         find_library(IOKIT_LIB IOKit)
312                         mark_as_advanced(
313                                 CARBON_LIB
314                                 COCOA_LIB
315                                 IOKIT_LIB
316                         )
317                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
318                 endif(APPLE)
319         endif(BUILD_CLIENT)
320         find_package(ZLIB REQUIRED)
321         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
322         if(APPLE)
323                 set(PLATFORM_LIBS "-framework CoreFoundation" ${PLATFORM_LIBS})
324         else()
325                 check_library_exists(rt clock_gettime "" HAVE_LIBRT)
326                 if (HAVE_LIBRT)
327                         set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
328                 endif(HAVE_LIBRT)
329         endif(APPLE)
330
331         # This way Xxf86vm is found on OpenBSD too
332         find_library(XXF86VM_LIBRARY Xxf86vm)
333         mark_as_advanced(XXF86VM_LIBRARY)
334         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
335
336         # Prefer local iconv if installed
337         find_library(ICONV_LIBRARY iconv)
338         mark_as_advanced(ICONV_LIBRARY)
339         if (ICONV_LIBRARY)
340                 set(PLATFORM_LIBS ${PLATFORM_LIBS} ${ICONV_LIBRARY})
341         endif()
342 endif()
343
344 check_include_files(endian.h HAVE_ENDIAN_H)
345
346 configure_file(
347         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
348         "${PROJECT_BINARY_DIR}/cmake_config.h"
349 )
350
351
352 # Add a target that always rebuilds cmake_config_githash.h
353 add_custom_target(GenerateVersion
354         COMMAND ${CMAKE_COMMAND}
355         -D "GENERATE_VERSION_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
356         -D "GENERATE_VERSION_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
357         -D "VERSION_STRING=${VERSION_STRING}"
358         -D "DEVELOPMENT_BUILD=${DEVELOPMENT_BUILD}"
359         -P "${CMAKE_SOURCE_DIR}/cmake/Modules/GenerateVersion.cmake"
360         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
361
362
363 add_subdirectory(threading)
364 add_subdirectory(network)
365 add_subdirectory(script)
366 add_subdirectory(unittest)
367 add_subdirectory(util)
368 add_subdirectory(irrlicht_changes)
369
370 set(common_SRCS
371         ban.cpp
372         cavegen.cpp
373         chat.cpp
374         clientiface.cpp
375         collision.cpp
376         content_mapnode.cpp
377         content_nodemeta.cpp
378         content_sao.cpp
379         convert_json.cpp
380         craftdef.cpp
381         database-dummy.cpp
382         database-files.cpp
383         database-leveldb.cpp
384         database-postgresql.cpp
385         database-redis.cpp
386         database-sqlite3.cpp
387         database.cpp
388         debug.cpp
389         defaultsettings.cpp
390         dungeongen.cpp
391         emerge.cpp
392         environment.cpp
393         face_position_cache.cpp
394         filesys.cpp
395         genericobject.cpp
396         gettext.cpp
397         httpfetch.cpp
398         inventory.cpp
399         inventorymanager.cpp
400         itemdef.cpp
401         itemstackmetadata.cpp
402         light.cpp
403         log.cpp
404         map.cpp
405         map_settings_manager.cpp
406         mapblock.cpp
407         mapgen.cpp
408         mapgen_carpathian.cpp
409         mapgen_flat.cpp
410         mapgen_fractal.cpp
411         mapgen_singlenode.cpp
412         mapgen_v5.cpp
413         mapgen_v6.cpp
414         mapgen_v7.cpp
415         mapgen_valleys.cpp
416         mapnode.cpp
417         mapsector.cpp
418         metadata.cpp
419         mg_biome.cpp
420         mg_decoration.cpp
421         mg_ore.cpp
422         mg_schematic.cpp
423         modchannels.cpp
424         mods.cpp
425         nameidmapping.cpp
426         nodedef.cpp
427         nodemetadata.cpp
428         nodetimer.cpp
429         noise.cpp
430         objdef.cpp
431         object_properties.cpp
432         pathfinder.cpp
433         player.cpp
434         porting.cpp
435         profiler.cpp
436         quicktune.cpp
437         raycast.cpp
438         reflowscan.cpp
439         remoteplayer.cpp
440         rollback.cpp
441         rollback_interface.cpp
442         serialization.cpp
443         server.cpp
444         serverenvironment.cpp
445         serverlist.cpp
446         serverobject.cpp
447         settings.cpp
448         sound.cpp
449         staticobject.cpp
450         subgame.cpp
451         terminal_chat_console.cpp
452         tileanimation.cpp
453         tool.cpp
454         translation.cpp
455         treegen.cpp
456         version.cpp
457         voxel.cpp
458         voxelalgorithms.cpp
459         ${common_network_SRCS}
460         ${JTHREAD_SRCS}
461         ${common_SCRIPT_SRCS}
462         ${UTIL_SRCS}
463         ${UNITTEST_SRCS}
464 )
465
466
467 # This gives us the icon and file version information
468 if(WIN32)
469         set(WINRESOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc")
470         set(MINETEST_EXE_MANIFEST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/minetest.exe.manifest")
471         if(MINGW)
472                 if(NOT CMAKE_RC_COMPILER)
473                         set(CMAKE_RC_COMPILER "windres.exe")
474                 endif()
475                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
476                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
477                         -i${WINRESOURCE_FILE}
478                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
479                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
480                         DEPENDS ${WINRESOURCE_FILE})
481                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
482         else(MINGW) # Probably MSVC
483                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE} ${MINETEST_EXE_MANIFEST_FILE})
484         endif(MINGW)
485 endif()
486
487
488 # Client sources
489 if (BUILD_CLIENT)
490         add_subdirectory(client)
491 endif(BUILD_CLIENT)
492
493 set(client_SRCS
494         ${client_SRCS}
495         ${common_SRCS}
496         ${sound_SRCS}
497         ${client_network_SRCS}
498         ${client_irrlicht_changes_SRCS}
499         camera.cpp
500         client.cpp
501         clientenvironment.cpp
502         clientmap.cpp
503         clientmedia.cpp
504         clientobject.cpp
505         clouds.cpp
506         content_cao.cpp
507         content_cso.cpp
508         content_mapblock.cpp
509         convert_json.cpp
510         filecache.cpp
511         fontengine.cpp
512         game.cpp
513         guiChatConsole.cpp
514         guiEngine.cpp
515         guiPathSelectMenu.cpp
516         guiFormSpecMenu.cpp
517         guiKeyChangeMenu.cpp
518         guiPasswordChange.cpp
519         guiscalingfilter.cpp
520         guiTable.cpp
521         guiVolumeChange.cpp
522         hud.cpp
523         imagefilters.cpp
524         intlGUIEditBox.cpp
525         keycode.cpp
526         localplayer.cpp
527         main.cpp
528         mapblock_mesh.cpp
529         mesh.cpp
530         mesh_generator_thread.cpp
531         minimap.cpp
532         particles.cpp
533         shader.cpp
534         sky.cpp
535         wieldmesh.cpp
536         ${client_SCRIPT_SRCS}
537         ${UNITTEST_CLIENT_SRCS}
538 )
539 list(SORT client_SRCS)
540
541 # Server sources
542 set(server_SRCS
543         ${common_SRCS}
544         main.cpp
545 )
546 list(SORT server_SRCS)
547
548 include_directories(
549         ${PROJECT_BINARY_DIR}
550         ${PROJECT_SOURCE_DIR}
551         ${IRRLICHT_INCLUDE_DIR}
552         ${ZLIB_INCLUDE_DIR}
553         ${CMAKE_BUILD_TYPE}
554         ${PNG_INCLUDE_DIR}
555         ${GETTEXT_INCLUDE_DIR}
556         ${SOUND_INCLUDE_DIRS}
557         ${SQLITE3_INCLUDE_DIR}
558         ${LUA_INCLUDE_DIR}
559         ${GMP_INCLUDE_DIR}
560         ${JSON_INCLUDE_DIR}
561         ${X11_INCLUDE_DIR}
562         ${PROJECT_SOURCE_DIR}/script
563 )
564
565
566 if(USE_FREETYPE)
567         include_directories(${FREETYPE_INCLUDE_DIRS})
568 endif()
569
570 if(USE_CURL)
571         include_directories(${CURL_INCLUDE_DIR})
572 endif()
573
574
575 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
576
577
578 if(BUILD_CLIENT)
579         add_executable(${PROJECT_NAME} ${client_SRCS})
580         add_dependencies(${PROJECT_NAME} GenerateVersion)
581         set(client_LIBS
582                 ${PROJECT_NAME}
583                 ${ZLIB_LIBRARIES}
584                 ${IRRLICHT_LIBRARY}
585                 ${OPENGL_LIBRARIES}
586                 ${JPEG_LIBRARIES}
587                 ${BZIP2_LIBRARIES}
588                 ${PNG_LIBRARIES}
589                 ${X11_LIBRARIES}
590                 ${GETTEXT_LIBRARY}
591                 ${SOUND_LIBRARIES}
592                 ${SQLITE3_LIBRARY}
593                 ${LUA_LIBRARY}
594                 ${GMP_LIBRARY}
595                 ${JSON_LIBRARY}
596                 ${OPENGLES2_LIBRARIES}
597                 ${PLATFORM_LIBS}
598                 ${CLIENT_PLATFORM_LIBS}
599         )
600         if(APPLE)
601                 target_link_libraries(
602                         ${client_LIBS}
603                         ${ICONV_LIBRARY}
604                 )
605         else()
606                 target_link_libraries(
607                         ${client_LIBS}
608                 )
609         endif()
610         if(USE_CURL)
611                 target_link_libraries(
612                         ${PROJECT_NAME}
613                         ${CURL_LIBRARY}
614                 )
615         endif()
616         if(USE_FREETYPE)
617                 if(FREETYPE_PKGCONFIG_FOUND)
618                         set_target_properties(${PROJECT_NAME}
619                                 PROPERTIES
620                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
621                         )
622                 endif()
623                 target_link_libraries(
624                         ${PROJECT_NAME}
625                         ${FREETYPE_LIBRARY}
626                 )
627         endif()
628         if (USE_CURSES)
629                 target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES})
630         endif()
631         if (USE_POSTGRESQL)
632                 target_link_libraries(${PROJECT_NAME} ${POSTGRESQL_LIBRARY})
633         endif()
634         if (USE_LEVELDB)
635                 target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
636         endif()
637         if (USE_REDIS)
638                 target_link_libraries(${PROJECT_NAME} ${REDIS_LIBRARY})
639         endif()
640         if (USE_SPATIAL)
641                 target_link_libraries(${PROJECT_NAME} ${SPATIAL_LIBRARY})
642         endif()
643 endif(BUILD_CLIENT)
644
645
646 if(BUILD_SERVER)
647         add_executable(${PROJECT_NAME}server ${server_SRCS})
648         add_dependencies(${PROJECT_NAME}server GenerateVersion)
649         target_link_libraries(
650                 ${PROJECT_NAME}server
651                 ${ZLIB_LIBRARIES}
652                 ${SQLITE3_LIBRARY}
653                 ${JSON_LIBRARY}
654                 ${GETTEXT_LIBRARY}
655                 ${LUA_LIBRARY}
656                 ${GMP_LIBRARY}
657                 ${PLATFORM_LIBS}
658         )
659         set_target_properties(${PROJECT_NAME}server PROPERTIES
660                         COMPILE_DEFINITIONS "SERVER")
661         if (USE_CURSES)
662                 target_link_libraries(${PROJECT_NAME}server ${CURSES_LIBRARIES})
663         endif()
664         if (USE_POSTGRESQL)
665                 target_link_libraries(${PROJECT_NAME}server ${POSTGRESQL_LIBRARY})
666         endif()
667         if (USE_LEVELDB)
668                 target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
669         endif()
670         if (USE_REDIS)
671                 target_link_libraries(${PROJECT_NAME}server ${REDIS_LIBRARY})
672         endif()
673         if (USE_SPATIAL)
674                 target_link_libraries(${PROJECT_NAME}server ${SPATIAL_LIBRARY})
675         endif()
676         if(USE_CURL)
677                 target_link_libraries(
678                         ${PROJECT_NAME}server
679                         ${CURL_LIBRARY}
680                 )
681         endif()
682 endif(BUILD_SERVER)
683
684 # Blacklisted locales that don't work.
685 # see issue #4638
686 set(GETTEXT_BLACKLISTED_LOCALES
687         be
688         he
689         ko
690         ky
691         zh_CN
692         zh_TW
693 )
694
695 option(APPLY_LOCALE_BLACKLIST "Use a blacklist to avoid broken locales" TRUE)
696
697 if (GETTEXT_FOUND AND APPLY_LOCALE_BLACKLIST)
698         set(GETTEXT_USED_LOCALES "")
699         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
700                 if (NOT ";${GETTEXT_BLACKLISTED_LOCALES};" MATCHES ";${LOCALE};")
701                         list(APPEND GETTEXT_USED_LOCALES ${LOCALE})
702                 endif()
703         endforeach()
704         message(STATUS "Locale blacklist applied; Locales used: ${GETTEXT_USED_LOCALES}")
705 endif()
706
707 # Set some optimizations and tweaks
708
709 include(CheckCXXCompilerFlag)
710
711 if(MSVC)
712         # Visual Studio
713         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D WIN32_LEAN_AND_MEAN /MP")
714         # EHa enables SEH exceptions (used for catching segfaults)
715         set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /GL /FD /MT /GS- /Zi /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
716         if(CMAKE_SIZEOF_VOID_P EQUAL 4)
717                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /arch:SSE")
718         endif()
719         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
720         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF")
721
722
723         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
724
725
726         set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
727
728         # Debug build doesn't catch exceptions by itself
729         # Add some optimizations because otherwise it's VERY slow
730         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
731
732         # Flags for C files (sqlite)
733         # /MT = Link statically with standard library stuff
734         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
735 else()
736         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
737         # Probably GCC
738         if(APPLE)
739                 SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
740         endif()
741         if(WARN_ALL)
742                 set(RELEASE_WARNING_FLAGS "-Wall")
743         else()
744                 set(RELEASE_WARNING_FLAGS "")
745         endif()
746
747         if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
748                 # clang does not understand __extern_always_inline but libc headers use it
749                 set(OTHER_FLAGS "${OTHER_FLAGS} \"-D__extern_always_inline=extern __always_inline\"")
750                 set(OTHER_FLAGS "${OTHER_FLAGS} -Wsign-compare")
751         endif()
752
753         if(WIN32 AND NOT ZLIBWAPI_DLL AND CMAKE_SIZEOF_VOID_P EQUAL 4)
754                 set(OTHER_FLAGS "${OTHER_FLAGS} -DWIN32_NO_ZLIB_WINAPI")
755                 message(WARNING "Defaulting to cdecl for zlib on win32 because ZLIBWAPI_DLL"
756                         " isn't set, ensure that ZLIBWAPI_DLL is set if you want stdcall.")
757         endif()
758
759         if(MINGW)
760                 set(OTHER_FLAGS "${OTHER_FLAGS} -mthreads -fexceptions")
761                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWIN32_LEAN_AND_MEAN")
762         endif()
763
764         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -Wall -pipe -funroll-loops")
765         if(CMAKE_SYSTEM_NAME MATCHES "(Darwin|FreeBSD)")
766                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
767         else()
768                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -ffast-math -fomit-frame-pointer")
769         endif(CMAKE_SYSTEM_NAME MATCHES "(Darwin|FreeBSD)")
770         set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
771         set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
772
773         if(USE_GPROF)
774                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
775         endif()
776
777         if(MINGW)
778                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mwindows")
779         endif()
780 endif()
781
782
783 # Installation
784
785 if(WIN32)
786         if(USE_SOUND)
787                 if(OPENAL_DLL)
788                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
789                 endif()
790                 if(OGG_DLL)
791                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
792                 endif()
793                 if(VORBIS_DLL)
794                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
795                 endif()
796                 if(VORBISFILE_DLL)
797                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
798                 endif()
799         endif()
800         if(CURL_DLL)
801                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
802         endif()
803         if(ZLIB_DLL)
804                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
805         endif()
806         if(ZLIBWAPI_DLL)
807                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
808         endif()
809         if(FREETYPE_DLL)
810                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
811         endif()
812         if(SQLITE3_DLL)
813                 install(FILES ${SQLITE3_DLL} DESTINATION ${BINDIR})
814         endif()
815         if(LEVELDB_DLL)
816                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
817         endif()
818         if(LUA_DLL)
819                 install(FILES ${LUA_DLL} DESTINATION ${BINDIR})
820         endif()
821 endif()
822
823 if(BUILD_CLIENT)
824         install(TARGETS ${PROJECT_NAME}
825                 RUNTIME DESTINATION ${BINDIR}
826                 LIBRARY DESTINATION ${BINDIR}
827                 ARCHIVE DESTINATION ${BINDIR}
828                 BUNDLE DESTINATION .
829         )
830
831         if(APPLE)
832                 install(CODE "
833                         set(BU_CHMOD_BUNDLE_ITEMS ON)
834                         include(BundleUtilities)
835                         fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${BUNDLE_PATH}\" \"\" \"\${CMAKE_INSTALL_PREFIX}/${BINDIR}\")
836                 " COMPONENT Runtime)
837         endif()
838
839         if(USE_GETTEXT)
840                 foreach(LOCALE ${GETTEXT_USED_LOCALES})
841                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
842                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
843                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
844                 endforeach()
845         endif()
846
847         if(WIN32)
848                 if(DEFINED IRRLICHT_DLL)
849                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
850                 endif()
851                 if(USE_GETTEXT)
852                         if(DEFINED GETTEXT_DLL)
853                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
854                         endif()
855                         if(DEFINED GETTEXT_ICONV_DLL)
856                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
857                         endif()
858                 endif()
859         endif()
860 endif(BUILD_CLIENT)
861
862 if(BUILD_SERVER)
863         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
864 endif()
865
866 if (USE_GETTEXT)
867         set(MO_FILES)
868
869         foreach(LOCALE ${GETTEXT_USED_LOCALES})
870                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME}.po")
871                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
872                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
873
874                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
875                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
876                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
877
878                 add_custom_command(
879                         OUTPUT ${MO_FILE_PATH}
880                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
881                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
882                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
883                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
884                         )
885
886                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
887         endforeach()
888
889         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
890 endif()