]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
2e624dd7f56475456645f5bea2645a869fd2a231
[minetest.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         else() # Probably MinGW = GCC
267                 set(PLATFORM_LIBS "")
268         endif()
269         set(PLATFORM_LIBS ws2_32.lib shlwapi.lib ${PLATFORM_LIBS})
270
271         # Zlib stuff
272         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
273                         CACHE PATH "Zlib include directory")
274         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
275                         CACHE FILEPATH "Path to zlib library (usually zlibwapi.lib)")
276         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
277                         CACHE FILEPATH "Path to zlib DLL (for installation)")
278         set(ZLIBWAPI_DLL "" CACHE FILEPATH "Path to zlibwapi DLL")
279         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
280                         CACHE PATH "irrlicht dir")
281         if(USE_FREETYPE)
282                 set(FREETYPE_INCLUDE_DIR_ft2build "${PROJECT_SOURCE_DIR}/../../freetype2/include/"
283                                 CACHE PATH "freetype include dir")
284                 set(FREETYPE_INCLUDE_DIR_freetype2 "${PROJECT_SOURCE_DIR}/../../freetype2/include/freetype"
285                                 CACHE PATH "freetype include dir")
286                 set(FREETYPE_LIBRARY "${PROJECT_SOURCE_DIR}/../../freetype2/objs/win32/vc2005/freetype247.lib"
287                                 CACHE FILEPATH "Path to freetype247.lib")
288         endif()
289         if(ENABLE_SOUND)
290                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
291                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
292                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
293                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
294         endif()
295         if(USE_LUAJIT)
296                 set(LUA_DLL "" CACHE FILEPATH "Path to lua51.dll for installation (optional)")
297         endif()
298 else()
299         # Unix probably
300         if(BUILD_CLIENT)
301                 find_package(X11 REQUIRED)
302                 find_package(OpenGL REQUIRED)
303                 find_package(JPEG REQUIRED)
304                 find_package(BZip2 REQUIRED)
305                 find_package(PNG REQUIRED)
306                 if(APPLE)
307                         find_library(CARBON_LIB Carbon)
308                         find_library(COCOA_LIB Cocoa)
309                         find_library(IOKIT_LIB IOKit)
310                         mark_as_advanced(
311                                 CARBON_LIB
312                                 COCOA_LIB
313                                 IOKIT_LIB
314                         )
315                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
316                 endif(APPLE)
317         endif(BUILD_CLIENT)
318         find_package(ZLIB REQUIRED)
319         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
320         if(APPLE)
321                 set(PLATFORM_LIBS "-framework CoreFoundation" ${PLATFORM_LIBS})
322         else()
323                 check_library_exists(rt clock_gettime "" HAVE_LIBRT)
324                 if (HAVE_LIBRT)
325                         set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
326                 endif(HAVE_LIBRT)
327         endif(APPLE)
328
329         # This way Xxf86vm is found on OpenBSD too
330         find_library(XXF86VM_LIBRARY Xxf86vm)
331         mark_as_advanced(XXF86VM_LIBRARY)
332         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
333
334         # Prefer local iconv if installed
335         find_library(ICONV_LIBRARY iconv)
336         mark_as_advanced(ICONV_LIBRARY)
337         if (ICONV_LIBRARY)
338                 set(PLATFORM_LIBS ${PLATFORM_LIBS} ${ICONV_LIBRARY})
339         endif()
340 endif()
341
342 check_include_files(endian.h HAVE_ENDIAN_H)
343
344 configure_file(
345         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
346         "${PROJECT_BINARY_DIR}/cmake_config.h"
347 )
348
349
350 # Add a target that always rebuilds cmake_config_githash.h
351 add_custom_target(GenerateVersion
352         COMMAND ${CMAKE_COMMAND}
353         -D "GENERATE_VERSION_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
354         -D "GENERATE_VERSION_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
355         -D "VERSION_STRING=${VERSION_STRING}"
356         -D "DEVELOPMENT_BUILD=${DEVELOPMENT_BUILD}"
357         -P "${CMAKE_SOURCE_DIR}/cmake/Modules/GenerateVersion.cmake"
358         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
359
360
361 add_subdirectory(threading)
362 add_subdirectory(network)
363 add_subdirectory(script)
364 add_subdirectory(unittest)
365 add_subdirectory(util)
366 add_subdirectory(irrlicht_changes)
367
368 set(common_SRCS
369         ban.cpp
370         cavegen.cpp
371         chat.cpp
372         clientiface.cpp
373         collision.cpp
374         content_mapnode.cpp
375         content_nodemeta.cpp
376         content_sao.cpp
377         convert_json.cpp
378         craftdef.cpp
379         database-dummy.cpp
380         database-files.cpp
381         database-leveldb.cpp
382         database-postgresql.cpp
383         database-redis.cpp
384         database-sqlite3.cpp
385         database.cpp
386         debug.cpp
387         defaultsettings.cpp
388         dungeongen.cpp
389         emerge.cpp
390         environment.cpp
391         face_position_cache.cpp
392         filesys.cpp
393         genericobject.cpp
394         gettext.cpp
395         httpfetch.cpp
396         inventory.cpp
397         inventorymanager.cpp
398         itemdef.cpp
399         itemstackmetadata.cpp
400         light.cpp
401         log.cpp
402         map.cpp
403         map_settings_manager.cpp
404         mapblock.cpp
405         mapgen.cpp
406         mapgen_carpathian.cpp
407         mapgen_flat.cpp
408         mapgen_fractal.cpp
409         mapgen_singlenode.cpp
410         mapgen_v5.cpp
411         mapgen_v6.cpp
412         mapgen_v7.cpp
413         mapgen_valleys.cpp
414         mapnode.cpp
415         mapsector.cpp
416         metadata.cpp
417         mg_biome.cpp
418         mg_decoration.cpp
419         mg_ore.cpp
420         mg_schematic.cpp
421         mods.cpp
422         nameidmapping.cpp
423         nodedef.cpp
424         nodemetadata.cpp
425         nodetimer.cpp
426         noise.cpp
427         objdef.cpp
428         object_properties.cpp
429         pathfinder.cpp
430         player.cpp
431         porting.cpp
432         profiler.cpp
433         quicktune.cpp
434         raycast.cpp
435         reflowscan.cpp
436         remoteplayer.cpp
437         rollback.cpp
438         rollback_interface.cpp
439         serialization.cpp
440         server.cpp
441         serverenvironment.cpp
442         serverlist.cpp
443         serverobject.cpp
444         settings.cpp
445         socket.cpp
446         sound.cpp
447         staticobject.cpp
448         subgame.cpp
449         terminal_chat_console.cpp
450         tileanimation.cpp
451         tool.cpp
452         treegen.cpp
453         version.cpp
454         voxel.cpp
455         voxelalgorithms.cpp
456         ${common_network_SRCS}
457         ${JTHREAD_SRCS}
458         ${common_SCRIPT_SRCS}
459         ${UTIL_SRCS}
460         ${UNITTEST_SRCS}
461 )
462
463
464 # This gives us the icon and file version information
465 if(WIN32)
466         set(WINRESOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc")
467         set(MINETEST_EXE_MANIFEST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/minetest.exe.manifest")
468         if(MINGW)
469                 if(NOT CMAKE_RC_COMPILER)
470                         set(CMAKE_RC_COMPILER "windres.exe")
471                 endif()
472                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
473                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
474                         -i${WINRESOURCE_FILE}
475                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
476                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
477                         DEPENDS ${WINRESOURCE_FILE})
478                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
479         else(MINGW) # Probably MSVC
480                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE} ${MINETEST_EXE_MANIFEST_FILE})
481         endif(MINGW)
482 endif()
483
484
485 # Client sources
486 if (BUILD_CLIENT)
487         add_subdirectory(client)
488 endif(BUILD_CLIENT)
489
490 set(client_SRCS
491         ${client_SRCS}
492         ${common_SRCS}
493         ${sound_SRCS}
494         ${client_network_SRCS}
495         ${client_irrlicht_changes_SRCS}
496         camera.cpp
497         client.cpp
498         clientenvironment.cpp
499         clientmap.cpp
500         clientmedia.cpp
501         clientobject.cpp
502         clouds.cpp
503         content_cao.cpp
504         content_cso.cpp
505         content_mapblock.cpp
506         convert_json.cpp
507         filecache.cpp
508         fontengine.cpp
509         game.cpp
510         guiChatConsole.cpp
511         guiEngine.cpp
512         guiPathSelectMenu.cpp
513         guiFormSpecMenu.cpp
514         guiKeyChangeMenu.cpp
515         guiPasswordChange.cpp
516         guiscalingfilter.cpp
517         guiTable.cpp
518         guiVolumeChange.cpp
519         hud.cpp
520         imagefilters.cpp
521         intlGUIEditBox.cpp
522         keycode.cpp
523         localplayer.cpp
524         main.cpp
525         mapblock_mesh.cpp
526         mesh.cpp
527         mesh_generator_thread.cpp
528         minimap.cpp
529         particles.cpp
530         shader.cpp
531         sky.cpp
532         wieldmesh.cpp
533         ${client_SCRIPT_SRCS}
534         ${UNITTEST_CLIENT_SRCS}
535 )
536 list(SORT client_SRCS)
537
538 # Server sources
539 set(server_SRCS
540         ${common_SRCS}
541         main.cpp
542 )
543 list(SORT server_SRCS)
544
545 include_directories(
546         ${PROJECT_BINARY_DIR}
547         ${PROJECT_SOURCE_DIR}
548         ${IRRLICHT_INCLUDE_DIR}
549         ${ZLIB_INCLUDE_DIR}
550         ${CMAKE_BUILD_TYPE}
551         ${PNG_INCLUDE_DIR}
552         ${GETTEXT_INCLUDE_DIR}
553         ${SOUND_INCLUDE_DIRS}
554         ${SQLITE3_INCLUDE_DIR}
555         ${LUA_INCLUDE_DIR}
556         ${GMP_INCLUDE_DIR}
557         ${JSON_INCLUDE_DIR}
558         ${X11_INCLUDE_DIR}
559         ${PROJECT_SOURCE_DIR}/script
560 )
561
562
563 if(USE_FREETYPE)
564         include_directories(${FREETYPE_INCLUDE_DIRS})
565 endif()
566
567 if(USE_CURL)
568         include_directories(${CURL_INCLUDE_DIR})
569 endif()
570
571
572 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
573
574
575 if(BUILD_CLIENT)
576         add_executable(${PROJECT_NAME} ${client_SRCS})
577         add_dependencies(${PROJECT_NAME} GenerateVersion)
578         set(client_LIBS
579                 ${PROJECT_NAME}
580                 ${ZLIB_LIBRARIES}
581                 ${IRRLICHT_LIBRARY}
582                 ${OPENGL_LIBRARIES}
583                 ${JPEG_LIBRARIES}
584                 ${BZIP2_LIBRARIES}
585                 ${PNG_LIBRARIES}
586                 ${X11_LIBRARIES}
587                 ${GETTEXT_LIBRARY}
588                 ${SOUND_LIBRARIES}
589                 ${SQLITE3_LIBRARY}
590                 ${LUA_LIBRARY}
591                 ${GMP_LIBRARY}
592                 ${JSON_LIBRARY}
593                 ${OPENGLES2_LIBRARIES}
594                 ${PLATFORM_LIBS}
595                 ${CLIENT_PLATFORM_LIBS}
596         )
597         if(APPLE)
598                 target_link_libraries(
599                         ${client_LIBS}
600                         ${ICONV_LIBRARY}
601                 )
602         else()
603                 target_link_libraries(
604                         ${client_LIBS}
605                 )
606         endif()
607         if(USE_CURL)
608                 target_link_libraries(
609                         ${PROJECT_NAME}
610                         ${CURL_LIBRARY}
611                 )
612         endif()
613         if(USE_FREETYPE)
614                 if(FREETYPE_PKGCONFIG_FOUND)
615                         set_target_properties(${PROJECT_NAME}
616                                 PROPERTIES
617                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
618                         )
619                 endif()
620                 target_link_libraries(
621                         ${PROJECT_NAME}
622                         ${FREETYPE_LIBRARY}
623                 )
624         endif()
625         if (USE_CURSES)
626                 target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES})
627         endif()
628         if (USE_POSTGRESQL)
629                 target_link_libraries(${PROJECT_NAME} ${POSTGRESQL_LIBRARY})
630         endif()
631         if (USE_LEVELDB)
632                 target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
633         endif()
634         if (USE_REDIS)
635                 target_link_libraries(${PROJECT_NAME} ${REDIS_LIBRARY})
636         endif()
637         if (USE_SPATIAL)
638                 target_link_libraries(${PROJECT_NAME} ${SPATIAL_LIBRARY})
639         endif()
640 endif(BUILD_CLIENT)
641
642
643 if(BUILD_SERVER)
644         add_executable(${PROJECT_NAME}server ${server_SRCS})
645         add_dependencies(${PROJECT_NAME}server GenerateVersion)
646         target_link_libraries(
647                 ${PROJECT_NAME}server
648                 ${ZLIB_LIBRARIES}
649                 ${SQLITE3_LIBRARY}
650                 ${JSON_LIBRARY}
651                 ${GETTEXT_LIBRARY}
652                 ${LUA_LIBRARY}
653                 ${GMP_LIBRARY}
654                 ${PLATFORM_LIBS}
655         )
656         set_target_properties(${PROJECT_NAME}server PROPERTIES
657                         COMPILE_DEFINITIONS "SERVER")
658         if (USE_CURSES)
659                 target_link_libraries(${PROJECT_NAME}server ${CURSES_LIBRARIES})
660         endif()
661         if (USE_POSTGRESQL)
662                 target_link_libraries(${PROJECT_NAME}server ${POSTGRESQL_LIBRARY})
663         endif()
664         if (USE_LEVELDB)
665                 target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
666         endif()
667         if (USE_REDIS)
668                 target_link_libraries(${PROJECT_NAME}server ${REDIS_LIBRARY})
669         endif()
670         if (USE_SPATIAL)
671                 target_link_libraries(${PROJECT_NAME}server ${SPATIAL_LIBRARY})
672         endif()
673         if(USE_CURL)
674                 target_link_libraries(
675                         ${PROJECT_NAME}server
676                         ${CURL_LIBRARY}
677                 )
678         endif()
679 endif(BUILD_SERVER)
680
681 # Blacklisted locales that don't work.
682 # see issue #4638
683 set(GETTEXT_BLACKLISTED_LOCALES
684         be
685         he
686         ko
687         ky
688         zh_CN
689         zh_TW
690 )
691
692 option(APPLY_LOCALE_BLACKLIST "Use a blacklist to avoid broken locales" TRUE)
693
694 if (GETTEXT_FOUND AND APPLY_LOCALE_BLACKLIST)
695         set(GETTEXT_USED_LOCALES "")
696         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
697                 if (NOT ";${GETTEXT_BLACKLISTED_LOCALES};" MATCHES ";${LOCALE};")
698                         list(APPEND GETTEXT_USED_LOCALES ${LOCALE})
699                 endif()
700         endforeach()
701         message(STATUS "Locale blacklist applied; Locales used: ${GETTEXT_USED_LOCALES}")
702 endif()
703
704 # Set some optimizations and tweaks
705
706 include(CheckCXXCompilerFlag)
707
708 if(MSVC)
709         # Visual Studio
710         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D WIN32_LEAN_AND_MEAN /MP")
711         # EHa enables SEH exceptions (used for catching segfaults)
712         set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /GL /FD /MT /GS- /Zi /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
713         if(CMAKE_SIZEOF_VOID_P EQUAL 4)
714                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /arch:SSE")
715         endif()
716         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
717         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF")
718
719
720         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
721
722
723         set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
724
725         # Debug build doesn't catch exceptions by itself
726         # Add some optimizations because otherwise it's VERY slow
727         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
728
729         # Flags for C files (sqlite)
730         # /MT = Link statically with standard library stuff
731         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
732 else()
733         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
734         # Probably GCC
735         if(APPLE)
736                 SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
737         endif()
738         if(WARN_ALL)
739                 set(RELEASE_WARNING_FLAGS "-Wall")
740         else()
741                 set(RELEASE_WARNING_FLAGS "")
742         endif()
743
744         if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
745                 # clang does not understand __extern_always_inline but libc headers use it
746                 set(OTHER_FLAGS "${OTHER_FLAGS} \"-D__extern_always_inline=extern __always_inline\"")
747                 set(OTHER_FLAGS "${OTHER_FLAGS} -Wsign-compare")
748         endif()
749
750         if(WIN32 AND NOT ZLIBWAPI_DLL AND CMAKE_SIZEOF_VOID_P EQUAL 4)
751                 set(OTHER_FLAGS "${OTHER_FLAGS} -DWIN32_NO_ZLIB_WINAPI")
752                 message(WARNING "Defaulting to cdecl for zlib on win32 because ZLIBWAPI_DLL"
753                         " isn't set, ensure that ZLIBWAPI_DLL is set if you want stdcall.")
754         endif()
755
756         if(MINGW)
757                 set(OTHER_FLAGS "${OTHER_FLAGS} -mthreads -fexceptions")
758                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWIN32_LEAN_AND_MEAN")
759         endif()
760
761         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -Wall -pipe -funroll-loops")
762         if(CMAKE_SYSTEM_NAME MATCHES "(Darwin|FreeBSD)")
763                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
764         else()
765                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -ffast-math -fomit-frame-pointer")
766         endif(CMAKE_SYSTEM_NAME MATCHES "(Darwin|FreeBSD)")
767         set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
768         set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
769
770         if(USE_GPROF)
771                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
772         endif()
773
774         if(MINGW)
775                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mwindows")
776         endif()
777 endif()
778
779
780 # Installation
781
782 if(WIN32)
783         if(USE_SOUND)
784                 if(OPENAL_DLL)
785                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
786                 endif()
787                 if(OGG_DLL)
788                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
789                 endif()
790                 if(VORBIS_DLL)
791                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
792                 endif()
793                 if(VORBISFILE_DLL)
794                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
795                 endif()
796         endif()
797         if(CURL_DLL)
798                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
799         endif()
800         if(ZLIB_DLL)
801                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
802         endif()
803         if(ZLIBWAPI_DLL)
804                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
805         endif()
806         if(FREETYPE_DLL)
807                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
808         endif()
809         if(SQLITE3_DLL)
810                 install(FILES ${SQLITE3_DLL} DESTINATION ${BINDIR})
811         endif()
812         if(LEVELDB_DLL)
813                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
814         endif()
815         if(LUA_DLL)
816                 install(FILES ${LUA_DLL} DESTINATION ${BINDIR})
817         endif()
818 endif()
819
820 if(BUILD_CLIENT)
821         install(TARGETS ${PROJECT_NAME}
822                 RUNTIME DESTINATION ${BINDIR}
823                 LIBRARY DESTINATION ${BINDIR}
824                 ARCHIVE DESTINATION ${BINDIR}
825                 BUNDLE DESTINATION .
826         )
827
828         if(APPLE)
829                 install(CODE "
830                         set(BU_CHMOD_BUNDLE_ITEMS ON)
831                         include(BundleUtilities)
832                         fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${BUNDLE_PATH}\" \"\" \"\${CMAKE_INSTALL_PREFIX}/${BINDIR}\")
833                 " COMPONENT Runtime)
834         endif()
835
836         if(USE_GETTEXT)
837                 foreach(LOCALE ${GETTEXT_USED_LOCALES})
838                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
839                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
840                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
841                 endforeach()
842         endif()
843
844         if(WIN32)
845                 if(DEFINED IRRLICHT_DLL)
846                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
847                 endif()
848                 if(USE_GETTEXT)
849                         if(DEFINED GETTEXT_DLL)
850                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
851                         endif()
852                         if(DEFINED GETTEXT_ICONV_DLL)
853                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
854                         endif()
855                 endif()
856         endif()
857 endif(BUILD_CLIENT)
858
859 if(BUILD_SERVER)
860         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
861 endif()
862
863 if (USE_GETTEXT)
864         set(MO_FILES)
865
866         foreach(LOCALE ${GETTEXT_USED_LOCALES})
867                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME}.po")
868                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
869                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
870
871                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
872                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
873                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
874
875                 add_custom_command(
876                         OUTPUT ${MO_FILE_PATH}
877                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
878                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
879                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
880                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
881                         )
882
883                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
884         endforeach()
885
886         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
887 endif()