]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
Allow mesh and nodeboxes to wave like plants or leaves. (#3497)
[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-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         filesys.cpp
392         genericobject.cpp
393         gettext.cpp
394         httpfetch.cpp
395         inventory.cpp
396         inventorymanager.cpp
397         itemdef.cpp
398         itemstackmetadata.cpp
399         light.cpp
400         log.cpp
401         map.cpp
402         map_settings_manager.cpp
403         mapblock.cpp
404         mapgen.cpp
405         mapgen_flat.cpp
406         mapgen_fractal.cpp
407         mapgen_singlenode.cpp
408         mapgen_v5.cpp
409         mapgen_v6.cpp
410         mapgen_v7.cpp
411         mapgen_valleys.cpp
412         mapnode.cpp
413         mapsector.cpp
414         metadata.cpp
415         mg_biome.cpp
416         mg_decoration.cpp
417         mg_ore.cpp
418         mg_schematic.cpp
419         mods.cpp
420         nameidmapping.cpp
421         nodedef.cpp
422         nodemetadata.cpp
423         nodetimer.cpp
424         noise.cpp
425         objdef.cpp
426         object_properties.cpp
427         pathfinder.cpp
428         player.cpp
429         porting.cpp
430         profiler.cpp
431         quicktune.cpp
432         reflowscan.cpp
433         remoteplayer.cpp
434         raycast.cpp
435         rollback.cpp
436         rollback_interface.cpp
437         serialization.cpp
438         server.cpp
439         serverenvironment.cpp
440         serverlist.cpp
441         serverobject.cpp
442         settings.cpp
443         socket.cpp
444         sound.cpp
445         staticobject.cpp
446         subgame.cpp
447         terminal_chat_console.cpp
448         tileanimation.cpp
449         tool.cpp
450         treegen.cpp
451         version.cpp
452         voxel.cpp
453         voxelalgorithms.cpp
454         ${common_network_SRCS}
455         ${JTHREAD_SRCS}
456         ${common_SCRIPT_SRCS}
457         ${UTIL_SRCS}
458         ${UNITTEST_SRCS}
459 )
460
461
462 # This gives us the icon and file version information
463 if(WIN32)
464         set(WINRESOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc")
465         set(MINETEST_EXE_MANIFEST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/minetest.exe.manifest")
466         if(MINGW)
467                 if(NOT CMAKE_RC_COMPILER)
468                         set(CMAKE_RC_COMPILER "windres.exe")
469                 endif()
470                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
471                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
472                         -i${WINRESOURCE_FILE}
473                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
474                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
475                         DEPENDS ${WINRESOURCE_FILE})
476                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
477         else(MINGW) # Probably MSVC
478                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE} ${MINETEST_EXE_MANIFEST_FILE})
479         endif(MINGW)
480 endif()
481
482
483 # Client sources
484 if (BUILD_CLIENT)
485         add_subdirectory(client)
486 endif(BUILD_CLIENT)
487
488 set(client_SRCS
489         ${client_SRCS}
490         ${common_SRCS}
491         ${sound_SRCS}
492         ${client_network_SRCS}
493         ${client_irrlicht_changes_SRCS}
494         camera.cpp
495         client.cpp
496         clientenvironment.cpp
497         clientmap.cpp
498         clientmedia.cpp
499         clientobject.cpp
500         clouds.cpp
501         content_cao.cpp
502         content_cso.cpp
503         content_mapblock.cpp
504         convert_json.cpp
505         drawscene.cpp
506         filecache.cpp
507         fontengine.cpp
508         game.cpp
509         guiChatConsole.cpp
510         guiEngine.cpp
511         guiFileSelectMenu.cpp
512         guiFormSpecMenu.cpp
513         guiKeyChangeMenu.cpp
514         guiPasswordChange.cpp
515         guiscalingfilter.cpp
516         guiTable.cpp
517         guiVolumeChange.cpp
518         hud.cpp
519         imagefilters.cpp
520         intlGUIEditBox.cpp
521         keycode.cpp
522         localplayer.cpp
523         main.cpp
524         mapblock_mesh.cpp
525         mesh.cpp
526         mesh_generator_thread.cpp
527         minimap.cpp
528         particles.cpp
529         shader.cpp
530         sky.cpp
531         wieldmesh.cpp
532         ${client_SCRIPT_SRCS}
533         ${UNITTEST_CLIENT_SRCS}
534 )
535 list(SORT client_SRCS)
536
537 # Server sources
538 set(server_SRCS
539         ${common_SRCS}
540         main.cpp
541 )
542 list(SORT server_SRCS)
543
544 include_directories(
545         ${PROJECT_BINARY_DIR}
546         ${PROJECT_SOURCE_DIR}
547         ${IRRLICHT_INCLUDE_DIR}
548         ${ZLIB_INCLUDE_DIR}
549         ${CMAKE_BUILD_TYPE}
550         ${PNG_INCLUDE_DIR}
551         ${GETTEXT_INCLUDE_DIR}
552         ${SOUND_INCLUDE_DIRS}
553         ${SQLITE3_INCLUDE_DIR}
554         ${LUA_INCLUDE_DIR}
555         ${GMP_INCLUDE_DIR}
556         ${JSON_INCLUDE_DIR}
557         ${X11_INCLUDE_DIR}
558         ${PROJECT_SOURCE_DIR}/script
559 )
560
561
562 if(USE_FREETYPE)
563         include_directories(${FREETYPE_INCLUDE_DIRS} ${CGUITTFONT_INCLUDE_DIR})
564 endif()
565
566 if(USE_CURL)
567         include_directories(${CURL_INCLUDE_DIR})
568 endif()
569
570
571 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
572
573
574 if(BUILD_CLIENT)
575         add_executable(${PROJECT_NAME} ${client_SRCS})
576         add_dependencies(${PROJECT_NAME} GenerateVersion)
577         set(client_LIBS
578                 ${PROJECT_NAME}
579                 ${ZLIB_LIBRARIES}
580                 ${IRRLICHT_LIBRARY}
581                 ${OPENGL_LIBRARIES}
582                 ${JPEG_LIBRARIES}
583                 ${BZIP2_LIBRARIES}
584                 ${PNG_LIBRARIES}
585                 ${X11_LIBRARIES}
586                 ${GETTEXT_LIBRARY}
587                 ${SOUND_LIBRARIES}
588                 ${SQLITE3_LIBRARY}
589                 ${LUA_LIBRARY}
590                 ${GMP_LIBRARY}
591                 ${JSON_LIBRARY}
592                 ${OPENGLES2_LIBRARIES}
593                 ${PLATFORM_LIBS}
594                 ${CLIENT_PLATFORM_LIBS}
595         )
596         if(APPLE)
597                 target_link_libraries(
598                         ${client_LIBS}
599                         ${ICONV_LIBRARY}
600                 )
601         else()
602                 target_link_libraries(
603                         ${client_LIBS}
604                 )
605         endif()
606         if(USE_CURL)
607                 target_link_libraries(
608                         ${PROJECT_NAME}
609                         ${CURL_LIBRARY}
610                 )
611         endif()
612         if(USE_FREETYPE)
613                 if(FREETYPE_PKGCONFIG_FOUND)
614                         set_target_properties(${PROJECT_NAME}
615                                 PROPERTIES
616                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
617                         )
618                 endif()
619                 target_link_libraries(
620                         ${PROJECT_NAME}
621                         ${FREETYPE_LIBRARY}
622                         ${CGUITTFONT_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
711         # EHa enables SEH exceptions (used for catching segfaults)
712         set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /GL /FD /MT /GS- /Zi /arch:SSE /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
713         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
714         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF")
715
716
717         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
718
719
720         set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
721
722         # Debug build doesn't catch exceptions by itself
723         # Add some optimizations because otherwise it's VERY slow
724         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
725
726         # Flags for C files (sqlite)
727         # /MT = Link statically with standard library stuff
728         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
729 else()
730         # Probably GCC
731         if(APPLE)
732                 SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
733         endif()
734         if(WARN_ALL)
735                 set(RELEASE_WARNING_FLAGS "-Wall")
736         else()
737                 set(RELEASE_WARNING_FLAGS "")
738         endif()
739
740         if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
741                 # clang does not understand __extern_always_inline but libc headers use it
742                 set(OTHER_FLAGS "${OTHER_FLAGS} \"-D__extern_always_inline=extern __always_inline\"")
743                 set(OTHER_FLAGS "${OTHER_FLAGS} -Wsign-compare")
744         endif()
745
746         if(WIN32 AND NOT ZLIBWAPI_DLL AND CMAKE_SIZEOF_VOID_P EQUAL 4)
747                 set(OTHER_FLAGS "${OTHER_FLAGS} -DWIN32_NO_ZLIB_WINAPI")
748                 message(WARNING "Defaulting to cdecl for zlib on win32 because ZLIBWAPI_DLL"
749                         " isn't set, ensure that ZLIBWAPI_DLL is set if you want stdcall.")
750         endif()
751
752         if(MINGW)
753                 set(OTHER_FLAGS "${OTHER_FLAGS} -mthreads -fexceptions")
754         endif()
755
756         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops")
757         if(APPLE)
758                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
759         else()
760                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -fomit-frame-pointer")
761         endif(APPLE)
762         set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
763         set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
764
765         if(USE_GPROF)
766                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
767         endif()
768
769         if(MINGW)
770                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mwindows")
771         endif()
772 endif()
773
774
775 # Installation
776
777 if(WIN32)
778         if(USE_SOUND)
779                 if(OPENAL_DLL)
780                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
781                 endif()
782                 if(OGG_DLL)
783                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
784                 endif()
785                 if(VORBIS_DLL)
786                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
787                 endif()
788                 if(VORBISFILE_DLL)
789                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
790                 endif()
791         endif()
792         if(CURL_DLL)
793                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
794         endif()
795         if(ZLIB_DLL)
796                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
797         endif()
798         if(ZLIBWAPI_DLL)
799                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
800         endif()
801         if(FREETYPE_DLL)
802                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
803         endif()
804         if(SQLITE3_DLL)
805                 install(FILES ${SQLITE3_DLL} DESTINATION ${BINDIR})
806         endif()
807         if(LEVELDB_DLL)
808                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
809         endif()
810 endif()
811
812 if(BUILD_CLIENT)
813         install(TARGETS ${PROJECT_NAME}
814                 RUNTIME DESTINATION ${BINDIR}
815                 LIBRARY DESTINATION ${BINDIR}
816                 ARCHIVE DESTINATION ${BINDIR}
817                 BUNDLE DESTINATION .
818         )
819
820         if(APPLE)
821                 install(CODE "
822                         set(BU_CHMOD_BUNDLE_ITEMS ON)
823                         include(BundleUtilities)
824                         fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${BUNDLE_PATH}\" \"\" \"\${CMAKE_INSTALL_PREFIX}/${BINDIR}\")
825                 " COMPONENT Runtime)
826         endif()
827
828         if(USE_GETTEXT)
829                 foreach(LOCALE ${GETTEXT_USED_LOCALES})
830                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
831                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
832                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
833                 endforeach()
834         endif()
835
836         if(WIN32)
837                 if(DEFINED IRRLICHT_DLL)
838                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
839                 endif()
840                 if(USE_GETTEXT)
841                         if(DEFINED GETTEXT_DLL)
842                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
843                         endif()
844                         if(DEFINED GETTEXT_ICONV_DLL)
845                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
846                         endif()
847                 endif()
848         endif()
849 endif(BUILD_CLIENT)
850
851 if(BUILD_SERVER)
852         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
853 endif()
854
855 if (USE_GETTEXT)
856         set(MO_FILES)
857
858         foreach(LOCALE ${GETTEXT_USED_LOCALES})
859                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME}.po")
860                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
861                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
862
863                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
864                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
865                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
866
867                 add_custom_command(
868                         OUTPUT ${MO_FILE_PATH}
869                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
870                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
871                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
872                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
873                         )
874
875                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
876         endforeach()
877
878         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
879 endif()
880
881
882 # Subdirectories
883
884 if (BUILD_CLIENT AND USE_FREETYPE)
885         add_subdirectory(cguittfont)
886 endif()