Tolerate packet reordering in the early init process
[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                 set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
340         endif(APPLE)
341
342         # This way Xxf86vm is found on OpenBSD too
343         find_library(XXF86VM_LIBRARY Xxf86vm)
344         mark_as_advanced(XXF86VM_LIBRARY)
345         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
346
347         # Prefer local iconv if installed
348         find_library(ICONV_LIBRARY iconv)
349         mark_as_advanced(ICONV_LIBRARY)
350         if (ICONV_LIBRARY)
351                 set(PLATFORM_LIBS ${PLATFORM_LIBS} ${ICONV_LIBRARY})
352         endif()
353 endif()
354
355 check_include_files(endian.h HAVE_ENDIAN_H)
356
357 configure_file(
358         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
359         "${PROJECT_BINARY_DIR}/cmake_config.h"
360 )
361
362
363 # Add a target that always rebuilds cmake_config_githash.h
364 add_custom_target(GenerateVersion
365         COMMAND ${CMAKE_COMMAND}
366         -D "GENERATE_VERSION_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
367         -D "GENERATE_VERSION_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
368         -D "VERSION_STRING=${VERSION_STRING}"
369         -D "DEVELOPMENT_BUILD=${DEVELOPMENT_BUILD}"
370         -P "${CMAKE_SOURCE_DIR}/cmake/Modules/GenerateVersion.cmake"
371         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
372
373
374 add_subdirectory(threading)
375 add_subdirectory(network)
376 add_subdirectory(script)
377 add_subdirectory(unittest)
378 add_subdirectory(util)
379
380 set(common_SRCS
381         ban.cpp
382         cavegen.cpp
383         chat.cpp
384         clientiface.cpp
385         collision.cpp
386         content_abm.cpp
387         content_mapnode.cpp
388         content_nodemeta.cpp
389         content_sao.cpp
390         convert_json.cpp
391         craftdef.cpp
392         database-dummy.cpp
393         database-leveldb.cpp
394         database-postgresql.cpp
395         database-redis.cpp
396         database-sqlite3.cpp
397         database.cpp
398         debug.cpp
399         defaultsettings.cpp
400         dungeongen.cpp
401         emerge.cpp
402         environment.cpp
403         filesys.cpp
404         genericobject.cpp
405         gettext.cpp
406         httpfetch.cpp
407         inventory.cpp
408         inventorymanager.cpp
409         itemdef.cpp
410         light.cpp
411         log.cpp
412         map.cpp
413         mapblock.cpp
414         mapgen.cpp
415         mapgen_flat.cpp
416         mapgen_fractal.cpp
417         mapgen_singlenode.cpp
418         mapgen_v5.cpp
419         mapgen_v6.cpp
420         mapgen_v7.cpp
421         mapgen_valleys.cpp
422         mapnode.cpp
423         mapsector.cpp
424         mg_biome.cpp
425         mg_decoration.cpp
426         mg_ore.cpp
427         mg_schematic.cpp
428         mods.cpp
429         nameidmapping.cpp
430         nodedef.cpp
431         nodemetadata.cpp
432         nodetimer.cpp
433         noise.cpp
434         objdef.cpp
435         object_properties.cpp
436         pathfinder.cpp
437         player.cpp
438         porting.cpp
439         profiler.cpp
440         quicktune.cpp
441         rollback.cpp
442         rollback_interface.cpp
443         serialization.cpp
444         server.cpp
445         serverlist.cpp
446         serverobject.cpp
447         settings.cpp
448         socket.cpp
449         sound.cpp
450         staticobject.cpp
451         subgame.cpp
452         terminal_chat_console.cpp
453         tool.cpp
454         treegen.cpp
455         version.cpp
456         voxel.cpp
457         voxelalgorithms.cpp
458         ${common_network_SRCS}
459         ${JTHREAD_SRCS}
460         ${common_SCRIPT_SRCS}
461         ${UTIL_SRCS}
462         ${UNITTEST_SRCS}
463 )
464
465
466 # This gives us the icon and file version information
467 if(WIN32)
468         set(WINRESOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc")
469         if(MINGW)
470                 if(NOT CMAKE_RC_COMPILER)
471                         set(CMAKE_RC_COMPILER "windres.exe")
472                 endif()
473                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
474                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
475                         -i${WINRESOURCE_FILE}
476                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
477                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
478                         DEPENDS ${WINRESOURCE_FILE})
479                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
480         else(MINGW) # Probably MSVC
481                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
482         endif(MINGW)
483 endif()
484
485
486 # Client sources
487 if (BUILD_CLIENT)
488         add_subdirectory(client)
489 endif(BUILD_CLIENT)
490
491 set(client_SRCS
492         ${client_SRCS}
493         ${common_SRCS}
494         ${sound_SRCS}
495         ${client_network_SRCS}
496         camera.cpp
497         client.cpp
498         clientmap.cpp
499         clientmedia.cpp
500         clientobject.cpp
501         clouds.cpp
502         content_cao.cpp
503         content_cso.cpp
504         content_mapblock.cpp
505         convert_json.cpp
506         drawscene.cpp
507         filecache.cpp
508         fontengine.cpp
509         game.cpp
510         guiChatConsole.cpp
511         guiEngine.cpp
512         guiFileSelectMenu.cpp
513         guiFormSpecMenu.cpp
514         guiKeyChangeMenu.cpp
515         guiPasswordChange.cpp
516         guiscalingfilter.cpp
517         guiTable.cpp
518         guiVolumeChange.cpp
519         hud.cpp
520         imagefilters.cpp
521         intlGUIEditBox.cpp
522         keycode.cpp
523         localplayer.cpp
524         main.cpp
525         mapblock_mesh.cpp
526         mesh.cpp
527         minimap.cpp
528         particles.cpp
529         shader.cpp
530         sky.cpp
531         wieldmesh.cpp
532         ${client_SCRIPT_SRCS}
533 )
534 list(SORT client_SRCS)
535
536 # Server sources
537 set(server_SRCS
538         ${common_SRCS}
539         main.cpp
540 )
541 list(SORT server_SRCS)
542
543 include_directories(
544         ${PROJECT_BINARY_DIR}
545         ${PROJECT_SOURCE_DIR}
546         ${IRRLICHT_INCLUDE_DIR}
547         ${ZLIB_INCLUDE_DIR}
548         ${CMAKE_BUILD_TYPE}
549         ${PNG_INCLUDE_DIR}
550         ${GETTEXT_INCLUDE_DIR}
551         ${SOUND_INCLUDE_DIRS}
552         ${SQLITE3_INCLUDE_DIR}
553         ${LUA_INCLUDE_DIR}
554         ${GMP_INCLUDE_DIR}
555         ${JSON_INCLUDE_DIR}
556         ${PROJECT_SOURCE_DIR}/script
557 )
558
559
560 if(USE_FREETYPE)
561         include_directories(${FREETYPE_INCLUDE_DIRS} ${CGUITTFONT_INCLUDE_DIR})
562 endif()
563
564 if(USE_CURL)
565         include_directories(${CURL_INCLUDE_DIR})
566 endif()
567
568
569 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
570
571
572 if(BUILD_CLIENT)
573         add_executable(${PROJECT_NAME} ${client_SRCS})
574         add_dependencies(${PROJECT_NAME} GenerateVersion)
575         set(client_LIBS
576                 ${PROJECT_NAME}
577                 ${ZLIB_LIBRARIES}
578                 ${IRRLICHT_LIBRARY}
579                 ${OPENGL_LIBRARIES}
580                 ${JPEG_LIBRARIES}
581                 ${BZIP2_LIBRARIES}
582                 ${PNG_LIBRARIES}
583                 ${X11_LIBRARIES}
584                 ${GETTEXT_LIBRARY}
585                 ${SOUND_LIBRARIES}
586                 ${SQLITE3_LIBRARY}
587                 ${LUA_LIBRARY}
588                 ${GMP_LIBRARY}
589                 ${JSON_LIBRARY}
590                 ${OPENGLES2_LIBRARIES}
591                 ${PLATFORM_LIBS}
592                 ${CLIENT_PLATFORM_LIBS}
593         )
594         if(APPLE)
595                 target_link_libraries(
596                         ${client_LIBS}
597                         ${ICONV_LIBRARY}
598                 )
599         else()
600                 target_link_libraries(
601                         ${client_LIBS}
602                 )
603         endif()
604         if(USE_CURL)
605                 target_link_libraries(
606                         ${PROJECT_NAME}
607                         ${CURL_LIBRARY}
608                 )
609         endif()
610         if(USE_FREETYPE)
611                 if(FREETYPE_PKGCONFIG_FOUND)
612                         set_target_properties(${PROJECT_NAME}
613                                 PROPERTIES
614                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
615                         )
616                 endif()
617                 target_link_libraries(
618                         ${PROJECT_NAME}
619                         ${FREETYPE_LIBRARY}
620                         ${CGUITTFONT_LIBRARY}
621                 )
622         endif()
623         if (USE_CURSES)
624                 target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES})
625         endif()
626         if (USE_POSTGRESQL)
627                 target_link_libraries(${PROJECT_NAME} ${POSTGRESQL_LIBRARY})
628         endif()
629         if (USE_LEVELDB)
630                 target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
631         endif()
632         if (USE_REDIS)
633                 target_link_libraries(${PROJECT_NAME} ${REDIS_LIBRARY})
634         endif()
635         if (USE_SPATIAL)
636                 target_link_libraries(${PROJECT_NAME} ${SPATIAL_LIBRARY})
637         endif()
638 endif(BUILD_CLIENT)
639
640
641 if(BUILD_SERVER)
642         add_executable(${PROJECT_NAME}server ${server_SRCS})
643         add_dependencies(${PROJECT_NAME}server GenerateVersion)
644         target_link_libraries(
645                 ${PROJECT_NAME}server
646                 ${ZLIB_LIBRARIES}
647                 ${SQLITE3_LIBRARY}
648                 ${JSON_LIBRARY}
649                 ${GETTEXT_LIBRARY}
650                 ${LUA_LIBRARY}
651                 ${GMP_LIBRARY}
652                 ${PLATFORM_LIBS}
653         )
654         set_target_properties(${PROJECT_NAME}server PROPERTIES
655                         COMPILE_DEFINITIONS "SERVER")
656         if (USE_CURSES)
657                 target_link_libraries(${PROJECT_NAME}server ${CURSES_LIBRARIES})
658         endif()
659         if (USE_POSTGRESQL)
660                 target_link_libraries(${PROJECT_NAME}server ${POSTGRESQL_LIBRARY})
661         endif()
662         if (USE_LEVELDB)
663                 target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
664         endif()
665         if (USE_REDIS)
666                 target_link_libraries(${PROJECT_NAME}server ${REDIS_LIBRARY})
667         endif()
668         if (USE_SPATIAL)
669                 target_link_libraries(${PROJECT_NAME}server ${SPATIAL_LIBRARY})
670         endif()
671         if(USE_CURL)
672                 target_link_libraries(
673                         ${PROJECT_NAME}server
674                         ${CURL_LIBRARY}
675                 )
676         endif()
677 endif(BUILD_SERVER)
678
679
680 # Set some optimizations and tweaks
681
682 include(CheckCXXCompilerFlag)
683
684 if(MSVC)
685         # Visual Studio
686
687         # EHa enables SEH exceptions (used for catching segfaults)
688         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")
689         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
690         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
691
692         set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
693
694         # Debug build doesn't catch exceptions by itself
695         # Add some optimizations because otherwise it's VERY slow
696         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
697
698         # Flags for C files (sqlite)
699         # /MT = Link statically with standard library stuff
700         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
701 else()
702         # Probably GCC
703         if(APPLE)
704                 SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
705         endif()
706         if(WARN_ALL)
707                 set(RELEASE_WARNING_FLAGS "-Wall")
708         else()
709                 set(RELEASE_WARNING_FLAGS "")
710         endif()
711
712         if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
713                 # clang does not understand __extern_always_inline but libc headers use it
714                 set(OTHER_FLAGS "${OTHER_FLAGS} \"-D__extern_always_inline=extern __always_inline\"")
715                 set(OTHER_FLAGS "${OTHER_FLAGS} -Wsign-compare")
716         endif()
717
718         if(MINGW)
719                 set(OTHER_FLAGS "-mthreads -fexceptions")
720         endif()
721
722         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops")
723         if(APPLE)
724                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
725         else()
726                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -fomit-frame-pointer")
727         endif(APPLE)
728         set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
729         set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
730
731         if(USE_GPROF)
732                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
733         endif()
734 endif()
735
736
737 # Installation
738
739 if(WIN32)
740         if(USE_SOUND)
741                 if(OPENAL_DLL)
742                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
743                 endif()
744                 if(OGG_DLL)
745                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
746                 endif()
747                 if(VORBIS_DLL)
748                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
749                 endif()
750                 if(VORBISFILE_DLL)
751                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
752                 endif()
753         endif()
754         if(CURL_DLL)
755                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
756         endif()
757         if(ZLIB_DLL)
758                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
759         endif()
760         if(ZLIBWAPI_DLL)
761                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
762         endif()
763         if(FREETYPE_DLL)
764                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
765         endif()
766         if(SQLITE3_DLL)
767                 install(FILES ${SQLITE3_DLL} DESTINATION ${BINDIR})
768         endif()
769         if(LEVELDB_DLL)
770                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
771         endif()
772 endif()
773
774 if(BUILD_CLIENT)
775         install(TARGETS ${PROJECT_NAME}
776                 RUNTIME DESTINATION ${BINDIR}
777                 LIBRARY DESTINATION ${BINDIR}
778                 ARCHIVE DESTINATION ${BINDIR}
779                 BUNDLE DESTINATION .
780         )
781
782         if(APPLE)
783                 install(CODE "
784                         set(BU_CHMOD_BUNDLE_ITEMS ON)
785                         include(BundleUtilities)
786                         fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${BUNDLE_PATH}\" \"\" \"\${CMAKE_INSTALL_PREFIX}/${BINDIR}\")
787                 " COMPONENT Runtime)
788         endif()
789
790         if(USE_GETTEXT)
791                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
792                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
793                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
794                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
795                 endforeach()
796         endif()
797
798         if(WIN32)
799                 if(DEFINED IRRLICHT_DLL)
800                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
801                 endif()
802                 if(USE_GETTEXT)
803                         if(DEFINED GETTEXT_DLL)
804                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
805                         endif()
806                         if(DEFINED GETTEXT_ICONV_DLL)
807                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
808                         endif()
809                 endif()
810         endif()
811 endif(BUILD_CLIENT)
812
813 if(BUILD_SERVER)
814         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
815 endif()
816
817 if (USE_GETTEXT)
818         set(MO_FILES)
819
820         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
821                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME}.po")
822                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
823                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
824
825                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
826                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
827                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
828
829                 add_custom_command(
830                         OUTPUT ${MO_FILE_PATH}
831                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
832                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
833                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
834                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
835                         )
836
837                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
838         endforeach()
839
840         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
841 endif()
842
843
844 # Subdirectories
845
846 if (BUILD_CLIENT AND USE_FREETYPE)
847         add_subdirectory(cguittfont)
848 endif()
849