]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
Find PostgreSQL correctly (#8435)
[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" TRUE)
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
105 option(ENABLE_GLES "Enable OpenGL ES support" FALSE)
106 mark_as_advanced(ENABLE_GLES)
107 if(ENABLE_GLES)
108         find_package(OpenGLES2)
109 endif()
110
111
112 option(ENABLE_FREETYPE "Enable FreeType2 (TrueType fonts and basic unicode support)" TRUE)
113 set(USE_FREETYPE FALSE)
114
115 if(ENABLE_FREETYPE)
116 ##
117 ## Note: FindFreetype.cmake seems to have been fixed in recent versions of
118 ## CMake. If issues persist, re-enable this workaround specificially for the
119 ## failing platforms.
120 ##
121 #       if(UNIX)
122 #               include(FindPkgConfig)
123 #               if(PKG_CONFIG_FOUND)
124 #                       pkg_check_modules(FREETYPE QUIET freetype2)
125 #                       if(FREETYPE_FOUND)
126 #                               SET(FREETYPE_PKGCONFIG_FOUND TRUE)
127 #                               SET(FREETYPE_LIBRARY ${FREETYPE_LIBRARIES})
128 #                               # Because CMake is idiotic
129 #                               string(REPLACE ";" " " FREETYPE_CFLAGS_STR ${FREETYPE_CFLAGS})
130 #                               string(REPLACE ";" " " FREETYPE_LDFLAGS_STR ${FREETYPE_LDFLAGS})
131 #                       endif(FREETYPE_FOUND)
132 #               endif(PKG_CONFIG_FOUND)
133 #       endif(UNIX)
134 #       if(NOT FREETYPE_FOUND)
135 #               find_package(Freetype)
136 #       endif()
137         find_package(Freetype)
138         if(FREETYPE_FOUND)
139                 message(STATUS "Freetype enabled.")
140                 set(USE_FREETYPE TRUE)
141         endif()
142 endif(ENABLE_FREETYPE)
143
144 option(ENABLE_CURSES "Enable ncurses console" TRUE)
145 set(USE_CURSES FALSE)
146
147 if(ENABLE_CURSES)
148         find_package(Ncursesw)
149         if(CURSES_FOUND)
150                 set(USE_CURSES TRUE)
151                 message(STATUS "ncurses console enabled.")
152                 include_directories(${CURSES_INCLUDE_DIRS})
153         else()
154                 message(STATUS "ncurses not found!")
155         endif()
156 endif(ENABLE_CURSES)
157
158 option(ENABLE_POSTGRESQL "Enable PostgreSQL backend" TRUE)
159 set(USE_POSTGRESQL FALSE)
160
161 if(ENABLE_POSTGRESQL)
162         find_package("PostgreSQL")
163
164         if(PostgreSQL_FOUND)
165                 set(USE_POSTGRESQL TRUE)
166                 message(STATUS "PostgreSQL backend enabled")
167                 # This variable is case sensitive, don't try to change it to POSTGRESQL_INCLUDE_DIR
168                 message(STATUS "PostgreSQL includes: ${PostgreSQL_INCLUDE_DIRS}")
169                 include_directories(${PostgreSQL_INCLUDE_DIRS})
170         else()
171                 message(STATUS "PostgreSQL not found!")
172         endif()
173 endif(ENABLE_POSTGRESQL)
174
175 option(ENABLE_LEVELDB "Enable LevelDB backend" TRUE)
176 set(USE_LEVELDB FALSE)
177
178 if(ENABLE_LEVELDB)
179         find_library(LEVELDB_LIBRARY leveldb)
180         find_path(LEVELDB_INCLUDE_DIR db.h PATH_SUFFIXES leveldb)
181         if(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
182                 set(USE_LEVELDB TRUE)
183                 message(STATUS "LevelDB backend enabled.")
184                 include_directories(${LEVELDB_INCLUDE_DIR})
185         else()
186                 message(STATUS "LevelDB not found!")
187         endif()
188 endif(ENABLE_LEVELDB)
189
190
191 OPTION(ENABLE_REDIS "Enable Redis backend" TRUE)
192 set(USE_REDIS FALSE)
193
194 if(ENABLE_REDIS)
195         find_library(REDIS_LIBRARY hiredis)
196         find_path(REDIS_INCLUDE_DIR hiredis.h PATH_SUFFIXES hiredis)
197         if(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
198                 set(USE_REDIS TRUE)
199                 message(STATUS "Redis backend enabled.")
200                 include_directories(${REDIS_INCLUDE_DIR})
201         else(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
202                 message(STATUS "Redis not found!")
203         endif(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
204 endif(ENABLE_REDIS)
205
206
207 find_package(SQLite3 REQUIRED)
208
209 OPTION(ENABLE_SPATIAL "Enable SpatialIndex AreaStore backend" TRUE)
210 set(USE_SPATIAL FALSE)
211
212 if(ENABLE_SPATIAL)
213         find_library(SPATIAL_LIBRARY spatialindex)
214         find_path(SPATIAL_INCLUDE_DIR spatialindex/SpatialIndex.h)
215         if(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
216                 set(USE_SPATIAL TRUE)
217                 message(STATUS "SpatialIndex AreaStore backend enabled.")
218                 include_directories(${SPATIAL_INCLUDE_DIR})
219         else(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
220                 message(STATUS "SpatialIndex not found!")
221         endif(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
222 endif(ENABLE_SPATIAL)
223
224
225 if(NOT MSVC)
226         set(USE_GPROF FALSE CACHE BOOL "Use -pg flag for g++")
227 endif()
228
229 # Haiku endian support
230 if(HAIKU)
231         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_BSD_SOURCE")
232         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_BSD_SOURCE")
233 endif()
234
235 # Use cmake_config.h
236 add_definitions(-DUSE_CMAKE_CONFIG_H)
237
238 if(WIN32)
239         # Windows
240         if(MSVC) # MSVC Specifics
241                 set(PLATFORM_LIBS dbghelp.lib ${PLATFORM_LIBS})
242                 # Surpress some useless warnings
243                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
244                 # Get M_PI to work
245                 add_definitions(/D "_USE_MATH_DEFINES")
246                 # Dont define min/max macros in minwindef.h
247                 add_definitions(/D "NOMINMAX")
248         else() # Probably MinGW = GCC
249                 set(PLATFORM_LIBS "")
250         endif()
251         set(PLATFORM_LIBS ws2_32.lib version.lib shlwapi.lib ${PLATFORM_LIBS})
252
253         # Zlib stuff
254         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
255                         CACHE PATH "Zlib include directory")
256         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
257                         CACHE FILEPATH "Path to zlib library (usually zlibwapi.lib)")
258         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
259                         CACHE FILEPATH "Path to zlib DLL (for installation)")
260         set(ZLIBWAPI_DLL "" CACHE FILEPATH "Path to zlibwapi DLL")
261         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
262                         CACHE PATH "irrlicht dir")
263         if(USE_FREETYPE)
264                 set(FREETYPE_INCLUDE_DIR_ft2build "${PROJECT_SOURCE_DIR}/../../freetype2/include/"
265                                 CACHE PATH "freetype include dir")
266                 set(FREETYPE_INCLUDE_DIR_freetype2 "${PROJECT_SOURCE_DIR}/../../freetype2/include/freetype"
267                                 CACHE PATH "freetype include dir")
268                 set(FREETYPE_LIBRARY "${PROJECT_SOURCE_DIR}/../../freetype2/objs/win32/vc2005/freetype247.lib"
269                                 CACHE FILEPATH "Path to freetype247.lib")
270         endif()
271         if(ENABLE_SOUND)
272                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
273                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
274                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
275                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
276         endif()
277         if(USE_LUAJIT)
278                 set(LUA_DLL "" CACHE FILEPATH "Path to lua51.dll for installation (optional)")
279         endif()
280 else()
281         # Unix probably
282         if(BUILD_CLIENT)
283                 if(NOT HAIKU)
284                         find_package(X11 REQUIRED)
285                 endif(NOT HAIKU)
286
287                 set(OPENGL_GL_PREFERENCE "LEGACY" CACHE STRING
288                         "See CMake Policy CMP0072 for reference. GLVND is broken on some nvidia setups")
289                 set(OpenGL_GL_PREFERENCE ${OPENGL_GL_PREFERENCE})
290
291                 find_package(OpenGL REQUIRED)
292                 find_package(JPEG REQUIRED)
293                 find_package(BZip2 REQUIRED)
294                 find_package(PNG REQUIRED)
295                 if(APPLE)
296                         find_library(CARBON_LIB Carbon)
297                         find_library(COCOA_LIB Cocoa)
298                         find_library(IOKIT_LIB IOKit)
299                         mark_as_advanced(
300                                 CARBON_LIB
301                                 COCOA_LIB
302                                 IOKIT_LIB
303                         )
304                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
305                 endif(APPLE)
306         endif(BUILD_CLIENT)
307         find_package(ZLIB REQUIRED)
308         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
309         if(APPLE)
310                 set(PLATFORM_LIBS "-framework CoreFoundation" ${PLATFORM_LIBS})
311         else()
312                 check_library_exists(rt clock_gettime "" HAVE_LIBRT)
313                 if (HAVE_LIBRT)
314                         set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
315                 endif(HAVE_LIBRT)
316         endif(APPLE)
317
318         if(NOT HAIKU AND NOT APPLE)
319         # This way Xxf86vm is found on OpenBSD too
320                 find_library(XXF86VM_LIBRARY Xxf86vm)
321                 mark_as_advanced(XXF86VM_LIBRARY)
322                 set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
323         endif(NOT HAIKU AND NOT APPLE)
324
325         # Prefer local iconv if installed
326         find_library(ICONV_LIBRARY iconv)
327         mark_as_advanced(ICONV_LIBRARY)
328         if (ICONV_LIBRARY)
329                 set(PLATFORM_LIBS ${PLATFORM_LIBS} ${ICONV_LIBRARY})
330         endif()
331 endif()
332
333 check_include_files(endian.h HAVE_ENDIAN_H)
334
335 configure_file(
336         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
337         "${PROJECT_BINARY_DIR}/cmake_config.h"
338 )
339
340
341 # Add a target that always rebuilds cmake_config_githash.h
342 add_custom_target(GenerateVersion
343         COMMAND ${CMAKE_COMMAND}
344         -D "GENERATE_VERSION_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
345         -D "GENERATE_VERSION_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
346         -D "VERSION_STRING=${VERSION_STRING}"
347         -D "DEVELOPMENT_BUILD=${DEVELOPMENT_BUILD}"
348         -P "${CMAKE_SOURCE_DIR}/cmake/Modules/GenerateVersion.cmake"
349         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
350
351
352 add_subdirectory(threading)
353 add_subdirectory(content)
354 add_subdirectory(database)
355 add_subdirectory(gui)
356 add_subdirectory(mapgen)
357 add_subdirectory(network)
358 add_subdirectory(script)
359 add_subdirectory(unittest)
360 add_subdirectory(util)
361 add_subdirectory(irrlicht_changes)
362 add_subdirectory(server)
363
364 set(common_SRCS
365         ${database_SRCS}
366         ${mapgen_SRCS}
367         ${server_SRCS}
368         ${content_SRCS}
369         ban.cpp
370         chat.cpp
371         clientiface.cpp
372         collision.cpp
373         content_mapnode.cpp
374         content_nodemeta.cpp
375         content_sao.cpp
376         convert_json.cpp
377         craftdef.cpp
378         debug.cpp
379         defaultsettings.cpp
380         emerge.cpp
381         environment.cpp
382         face_position_cache.cpp
383         filesys.cpp
384         genericobject.cpp
385         gettext.cpp
386         httpfetch.cpp
387         hud.cpp
388         inventory.cpp
389         inventorymanager.cpp
390         itemdef.cpp
391         itemstackmetadata.cpp
392         light.cpp
393         log.cpp
394         main.cpp
395         map.cpp
396         map_settings_manager.cpp
397         mapblock.cpp
398         mapnode.cpp
399         mapsector.cpp
400         metadata.cpp
401         modchannels.cpp
402         nameidmapping.cpp
403         nodedef.cpp
404         nodemetadata.cpp
405         nodetimer.cpp
406         noise.cpp
407         objdef.cpp
408         object_properties.cpp
409         pathfinder.cpp
410         player.cpp
411         porting.cpp
412         profiler.cpp
413         quicktune.cpp
414         raycast.cpp
415         reflowscan.cpp
416         remoteplayer.cpp
417         rollback.cpp
418         rollback_interface.cpp
419         serialization.cpp
420         server.cpp
421         serverenvironment.cpp
422         serverlist.cpp
423         serverobject.cpp
424         settings.cpp
425         staticobject.cpp
426         terminal_chat_console.cpp
427         tileanimation.cpp
428         tool.cpp
429         translation.cpp
430         version.cpp
431         voxel.cpp
432         voxelalgorithms.cpp
433         hud.cpp
434         ${common_network_SRCS}
435         ${JTHREAD_SRCS}
436         ${common_SCRIPT_SRCS}
437         ${UTIL_SRCS}
438         ${UNITTEST_SRCS}
439 )
440
441
442 # This gives us the icon and file version information
443 if(WIN32)
444         set(WINRESOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc")
445         set(MINETEST_EXE_MANIFEST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/minetest.exe.manifest")
446         if(MINGW)
447                 if(NOT CMAKE_RC_COMPILER)
448                         set(CMAKE_RC_COMPILER "windres.exe")
449                 endif()
450                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
451                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
452                         -i${WINRESOURCE_FILE}
453                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
454                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
455                         DEPENDS ${WINRESOURCE_FILE})
456                 SET(extra_windows_SRCS ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
457         else(MINGW) # Probably MSVC
458                 set(extra_windows_SRCS ${WINRESOURCE_FILE} ${MINETEST_EXE_MANIFEST_FILE})
459         endif(MINGW)
460 endif()
461
462
463 # Client sources
464 if (BUILD_CLIENT)
465         add_subdirectory(client)
466 endif(BUILD_CLIENT)
467
468 set(client_SRCS
469         ${client_SRCS}
470         ${common_SRCS}
471         ${gui_SRCS}
472         ${client_network_SRCS}
473         ${client_irrlicht_changes_SRCS}
474         ${client_SCRIPT_SRCS}
475         ${UNITTEST_CLIENT_SRCS}
476 )
477 list(SORT client_SRCS)
478
479 # Server sources
480 set(server_SRCS
481         ${common_SRCS}
482 )
483 list(SORT server_SRCS)
484
485 # Avoid source_group on broken CMake version.
486 # see issue #7074 #7075
487 if (CMAKE_VERSION VERSION_GREATER 3.8.1)
488         source_group(TREE ${PROJECT_SOURCE_DIR} PREFIX "Source Files" FILES ${client_SRCS})
489         source_group(TREE ${PROJECT_SOURCE_DIR} PREFIX "Source Files" FILES ${server_SRCS})
490 endif()
491
492 include_directories(
493         ${PROJECT_BINARY_DIR}
494         ${PROJECT_SOURCE_DIR}
495         ${IRRLICHT_INCLUDE_DIR}
496         ${ZLIB_INCLUDE_DIR}
497         ${CMAKE_BUILD_TYPE}
498         ${PNG_INCLUDE_DIR}
499         ${SOUND_INCLUDE_DIRS}
500         ${SQLITE3_INCLUDE_DIR}
501         ${LUA_INCLUDE_DIR}
502         ${GMP_INCLUDE_DIR}
503         ${JSON_INCLUDE_DIR}
504         ${X11_INCLUDE_DIR}
505         ${PROJECT_SOURCE_DIR}/script
506 )
507
508 if(USE_GETTEXT)
509         include_directories(${GETTEXT_INCLUDE_DIR})
510 endif()
511
512 if(USE_FREETYPE)
513         include_directories(${FREETYPE_INCLUDE_DIRS})
514 endif()
515
516 if(USE_CURL)
517         include_directories(${CURL_INCLUDE_DIR})
518 endif()
519
520
521 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
522
523
524 if(BUILD_CLIENT)
525         add_executable(${PROJECT_NAME} ${client_SRCS} ${extra_windows_SRCS})
526         add_dependencies(${PROJECT_NAME} GenerateVersion)
527         set(client_LIBS
528                 ${PROJECT_NAME}
529                 ${ZLIB_LIBRARIES}
530                 ${IRRLICHT_LIBRARY}
531                 ${OPENGL_LIBRARIES}
532                 ${JPEG_LIBRARIES}
533                 ${BZIP2_LIBRARIES}
534                 ${PNG_LIBRARIES}
535                 ${X11_LIBRARIES}
536                 ${SOUND_LIBRARIES}
537                 ${SQLITE3_LIBRARY}
538                 ${LUA_LIBRARY}
539                 ${GMP_LIBRARY}
540                 ${JSON_LIBRARY}
541                 ${OPENGLES2_LIBRARIES}
542                 ${PLATFORM_LIBS}
543                 ${CLIENT_PLATFORM_LIBS}
544         )
545         if(APPLE)
546                 target_link_libraries(
547                         ${client_LIBS}
548                         ${ICONV_LIBRARY}
549                 )
550         else()
551                 target_link_libraries(
552                         ${client_LIBS}
553                 )
554         endif()
555         if(USE_GETTEXT)
556                 target_link_libraries(
557                         ${PROJECT_NAME}
558                         ${GETTEXT_LIBRARY}
559                 )
560         endif()
561         if(USE_CURL)
562                 target_link_libraries(
563                         ${PROJECT_NAME}
564                         ${CURL_LIBRARY}
565                 )
566         endif()
567         if(USE_FREETYPE)
568                 if(FREETYPE_PKGCONFIG_FOUND)
569                         set_target_properties(${PROJECT_NAME}
570                                 PROPERTIES
571                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
572                         )
573                 endif()
574                 target_link_libraries(
575                         ${PROJECT_NAME}
576                         ${FREETYPE_LIBRARY}
577                 )
578         endif()
579         if (USE_CURSES)
580                 target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES})
581         endif()
582         if (USE_POSTGRESQL)
583                 target_link_libraries(${PROJECT_NAME} ${PostgreSQL_LIBRARIES})
584         endif()
585         if (USE_LEVELDB)
586                 target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
587         endif()
588         if (USE_REDIS)
589                 target_link_libraries(${PROJECT_NAME} ${REDIS_LIBRARY})
590         endif()
591         if (USE_SPATIAL)
592                 target_link_libraries(${PROJECT_NAME} ${SPATIAL_LIBRARY})
593         endif()
594 endif(BUILD_CLIENT)
595
596
597 if(BUILD_SERVER)
598         add_executable(${PROJECT_NAME}server ${server_SRCS} ${extra_windows_SRCS})
599         add_dependencies(${PROJECT_NAME}server GenerateVersion)
600         target_link_libraries(
601                 ${PROJECT_NAME}server
602                 ${ZLIB_LIBRARIES}
603                 ${SQLITE3_LIBRARY}
604                 ${JSON_LIBRARY}
605                 ${LUA_LIBRARY}
606                 ${GMP_LIBRARY}
607                 ${PLATFORM_LIBS}
608         )
609         set_target_properties(${PROJECT_NAME}server PROPERTIES
610                         COMPILE_DEFINITIONS "SERVER")
611         if (USE_GETTEXT)
612                 target_link_libraries(${PROJECT_NAME}server ${GETTEXT_LIBRARY})
613         endif()
614         if (USE_CURSES)
615                 target_link_libraries(${PROJECT_NAME}server ${CURSES_LIBRARIES})
616         endif()
617         if (USE_POSTGRESQL)
618                 target_link_libraries(${PROJECT_NAME}server ${PostgreSQL_LIBRARIES})
619         endif()
620         if (USE_LEVELDB)
621                 target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
622         endif()
623         if (USE_REDIS)
624                 target_link_libraries(${PROJECT_NAME}server ${REDIS_LIBRARY})
625         endif()
626         if (USE_SPATIAL)
627                 target_link_libraries(${PROJECT_NAME}server ${SPATIAL_LIBRARY})
628         endif()
629         if(USE_CURL)
630                 target_link_libraries(
631                         ${PROJECT_NAME}server
632                         ${CURL_LIBRARY}
633                 )
634         endif()
635 endif(BUILD_SERVER)
636
637 # Blacklisted locales that don't work.
638 # see issue #4638
639 set(GETTEXT_BLACKLISTED_LOCALES
640         be
641         he
642         ko
643         ky
644         zh_CN
645         zh_TW
646 )
647
648 option(APPLY_LOCALE_BLACKLIST "Use a blacklist to avoid broken locales" TRUE)
649
650 if (GETTEXT_FOUND AND APPLY_LOCALE_BLACKLIST)
651         set(GETTEXT_USED_LOCALES "")
652         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
653                 if (NOT ";${GETTEXT_BLACKLISTED_LOCALES};" MATCHES ";${LOCALE};")
654                         list(APPEND GETTEXT_USED_LOCALES ${LOCALE})
655                 endif()
656         endforeach()
657         message(STATUS "Locale blacklist applied; Locales used: ${GETTEXT_USED_LOCALES}")
658 endif()
659
660 # Set some optimizations and tweaks
661
662 include(CheckCXXCompilerFlag)
663
664 if(MSVC)
665         # Visual Studio
666         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D WIN32_LEAN_AND_MEAN /MP")
667         # EHa enables SEH exceptions (used for catching segfaults)
668         set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /GL /FD /MD /GS- /Zi /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
669         if(CMAKE_SIZEOF_VOID_P EQUAL 4)
670                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /arch:SSE")
671         endif()
672         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
673         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF")
674
675
676         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
677
678
679         set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
680
681         # Debug build doesn't catch exceptions by itself
682         # Add some optimizations because otherwise it's VERY slow
683         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
684
685         # Flags for C files (sqlite)
686         # /MD = dynamically link to MSVCRxxx.dll
687         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MD")
688 else()
689         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
690         # Probably GCC
691         if(APPLE)
692                 SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
693         endif()
694         if(WARN_ALL)
695                 set(RELEASE_WARNING_FLAGS "-Wall")
696         else()
697                 set(RELEASE_WARNING_FLAGS "")
698         endif()
699
700         if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
701                 # clang does not understand __extern_always_inline but libc headers use it
702                 set(OTHER_FLAGS "${OTHER_FLAGS} \"-D__extern_always_inline=extern __always_inline\"")
703                 set(OTHER_FLAGS "${OTHER_FLAGS} -Wsign-compare")
704         endif()
705
706         if(WIN32 AND NOT ZLIBWAPI_DLL AND CMAKE_SIZEOF_VOID_P EQUAL 4)
707                 set(OTHER_FLAGS "${OTHER_FLAGS} -DWIN32_NO_ZLIB_WINAPI")
708                 message(WARNING "Defaulting to cdecl for zlib on win32 because ZLIBWAPI_DLL"
709                         " isn't set, ensure that ZLIBWAPI_DLL is set if you want stdcall.")
710         endif()
711
712         if(MINGW)
713                 set(OTHER_FLAGS "${OTHER_FLAGS} -mthreads -fexceptions")
714                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWIN32_LEAN_AND_MEAN")
715         endif()
716
717         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -Wall -pipe -funroll-loops")
718         if(CMAKE_SYSTEM_NAME MATCHES "(Darwin|BSD|DragonFly)")
719                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
720         else()
721                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -ffast-math -fomit-frame-pointer")
722         endif(CMAKE_SYSTEM_NAME MATCHES "(Darwin|BSD|DragonFly)")
723         set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
724         set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
725
726         if(USE_GPROF)
727                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
728         endif()
729
730         if(MINGW)
731                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mwindows")
732         endif()
733 endif()
734
735
736 # Installation
737
738 if(WIN32)
739         if(USE_SOUND)
740                 if(OPENAL_DLL)
741                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
742                 endif()
743                 if(OGG_DLL)
744                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
745                 endif()
746                 if(VORBIS_DLL)
747                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
748                 endif()
749                 if(VORBISFILE_DLL)
750                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
751                 endif()
752         endif()
753         if(CURL_DLL)
754                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
755         endif()
756         if(ZLIB_DLL)
757                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
758         endif()
759         if(ZLIBWAPI_DLL)
760                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
761         endif()
762         if(FREETYPE_DLL)
763                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
764         endif()
765         if(SQLITE3_DLL)
766                 install(FILES ${SQLITE3_DLL} DESTINATION ${BINDIR})
767         endif()
768         if(LEVELDB_DLL)
769                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
770         endif()
771         if(LUA_DLL)
772                 install(FILES ${LUA_DLL} DESTINATION ${BINDIR})
773         endif()
774 endif()
775
776 if(BUILD_CLIENT)
777         install(TARGETS ${PROJECT_NAME}
778                 RUNTIME DESTINATION ${BINDIR}
779                 LIBRARY DESTINATION ${BINDIR}
780                 ARCHIVE DESTINATION ${BINDIR}
781                 BUNDLE DESTINATION .
782         )
783
784         if(APPLE)
785                 install(CODE "
786                         set(BU_CHMOD_BUNDLE_ITEMS ON)
787                         include(BundleUtilities)
788                         fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${BUNDLE_PATH}\" \"\" \"\${CMAKE_INSTALL_PREFIX}/${BINDIR}\")
789                 " COMPONENT Runtime)
790         endif()
791
792         if(USE_GETTEXT)
793                 foreach(LOCALE ${GETTEXT_USED_LOCALES})
794                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
795                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
796                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
797                 endforeach()
798         endif()
799
800         if(USE_FREETYPE)
801                 install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../fonts" DESTINATION "${SHAREDIR}"
802                                 FILES_MATCHING PATTERN "*.ttf" PATTERN "*.txt")
803         else()
804                 install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../fonts" DESTINATION "${SHAREDIR}"
805                                 FILES_MATCHING PATTERN "*.png" PATTERN "*.xml")
806         endif()
807
808         if(WIN32)
809                 if(DEFINED IRRLICHT_DLL)
810                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
811                 endif()
812                 if(USE_GETTEXT)
813                         if(DEFINED GETTEXT_DLL)
814                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
815                         endif()
816                         if(DEFINED GETTEXT_ICONV_DLL)
817                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
818                         endif()
819                 endif()
820         endif()
821 endif(BUILD_CLIENT)
822
823 if(BUILD_SERVER)
824         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
825 endif()
826
827 if (USE_GETTEXT)
828         set(MO_FILES)
829
830         foreach(LOCALE ${GETTEXT_USED_LOCALES})
831                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME}.po")
832                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
833                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
834
835                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
836                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
837                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
838
839                 add_custom_command(
840                         OUTPUT ${MO_FILE_PATH}
841                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
842                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
843                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
844                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
845                         )
846
847                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
848         endforeach()
849
850         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
851 endif()