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