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