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