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