Remove `mathconstants.h` and use the correct way to get `M_PI` in MSVC. (#5072)
[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                 # Get M_PI to work
288                 add_definitions(/D "_USE_MATH_DEFINES")
289         else() # Probably MinGW = GCC
290                 set(PLATFORM_LIBS "")
291         endif()
292         set(PLATFORM_LIBS ws2_32.lib shlwapi.lib ${PLATFORM_LIBS})
293
294         # Zlib stuff
295         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
296                         CACHE PATH "Zlib include directory")
297         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
298                         CACHE FILEPATH "Path to zlib library (usually zlibwapi.lib)")
299         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
300                         CACHE FILEPATH "Path to zlib DLL (for installation)")
301         set(ZLIBWAPI_DLL "" CACHE FILEPATH "Path to zlibwapi DLL")
302         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
303                         CACHE PATH "irrlicht dir")
304         if(USE_FREETYPE)
305                 set(FREETYPE_INCLUDE_DIR_ft2build "${PROJECT_SOURCE_DIR}/../../freetype2/include/"
306                                 CACHE PATH "freetype include dir")
307                 set(FREETYPE_INCLUDE_DIR_freetype2 "${PROJECT_SOURCE_DIR}/../../freetype2/include/freetype"
308                                 CACHE PATH "freetype include dir")
309                 set(FREETYPE_LIBRARY "${PROJECT_SOURCE_DIR}/../../freetype2/objs/win32/vc2005/freetype247.lib"
310                                 CACHE FILEPATH "Path to freetype247.lib")
311         endif()
312         if(ENABLE_SOUND)
313                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
314                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
315                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
316                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
317         endif()
318 else()
319         # Unix probably
320         if(BUILD_CLIENT)
321                 find_package(X11 REQUIRED)
322                 find_package(OpenGL REQUIRED)
323                 find_package(JPEG REQUIRED)
324                 find_package(BZip2 REQUIRED)
325                 find_package(PNG REQUIRED)
326                 if(APPLE)
327                         find_library(CARBON_LIB Carbon)
328                         find_library(COCOA_LIB Cocoa)
329                         find_library(IOKIT_LIB IOKit)
330                         mark_as_advanced(
331                                 CARBON_LIB
332                                 COCOA_LIB
333                                 IOKIT_LIB
334                         )
335                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
336                 endif(APPLE)
337         endif(BUILD_CLIENT)
338         find_package(ZLIB REQUIRED)
339         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
340         if(APPLE)
341                 set(PLATFORM_LIBS "-framework CoreFoundation" ${PLATFORM_LIBS})
342         else()
343                 check_library_exists(rt clock_gettime "" HAVE_LIBRT)
344                 if (HAVE_LIBRT)
345                         set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
346                 endif(HAVE_LIBRT)
347         endif(APPLE)
348
349         # This way Xxf86vm is found on OpenBSD too
350         find_library(XXF86VM_LIBRARY Xxf86vm)
351         mark_as_advanced(XXF86VM_LIBRARY)
352         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
353
354         # Prefer local iconv if installed
355         find_library(ICONV_LIBRARY iconv)
356         mark_as_advanced(ICONV_LIBRARY)
357         if (ICONV_LIBRARY)
358                 set(PLATFORM_LIBS ${PLATFORM_LIBS} ${ICONV_LIBRARY})
359         endif()
360 endif()
361
362 check_include_files(endian.h HAVE_ENDIAN_H)
363
364 configure_file(
365         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
366         "${PROJECT_BINARY_DIR}/cmake_config.h"
367 )
368
369
370 # Add a target that always rebuilds cmake_config_githash.h
371 add_custom_target(GenerateVersion
372         COMMAND ${CMAKE_COMMAND}
373         -D "GENERATE_VERSION_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
374         -D "GENERATE_VERSION_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
375         -D "VERSION_STRING=${VERSION_STRING}"
376         -D "DEVELOPMENT_BUILD=${DEVELOPMENT_BUILD}"
377         -P "${CMAKE_SOURCE_DIR}/cmake/Modules/GenerateVersion.cmake"
378         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
379
380
381 add_subdirectory(threading)
382 add_subdirectory(network)
383 add_subdirectory(script)
384 add_subdirectory(unittest)
385 add_subdirectory(util)
386 add_subdirectory(irrlicht_changes)
387
388 set(common_SRCS
389         ban.cpp
390         cavegen.cpp
391         chat.cpp
392         clientiface.cpp
393         collision.cpp
394         content_abm.cpp
395         content_mapnode.cpp
396         content_nodemeta.cpp
397         content_sao.cpp
398         convert_json.cpp
399         craftdef.cpp
400         database-dummy.cpp
401         database-leveldb.cpp
402         database-postgresql.cpp
403         database-redis.cpp
404         database-sqlite3.cpp
405         database.cpp
406         debug.cpp
407         defaultsettings.cpp
408         dungeongen.cpp
409         emerge.cpp
410         environment.cpp
411         filesys.cpp
412         genericobject.cpp
413         gettext.cpp
414         httpfetch.cpp
415         inventory.cpp
416         inventorymanager.cpp
417         itemdef.cpp
418         light.cpp
419         log.cpp
420         map.cpp
421         map_settings_manager.cpp
422         mapblock.cpp
423         mapgen.cpp
424         mapgen_flat.cpp
425         mapgen_fractal.cpp
426         mapgen_singlenode.cpp
427         mapgen_v5.cpp
428         mapgen_v6.cpp
429         mapgen_v7.cpp
430         mapgen_valleys.cpp
431         mapnode.cpp
432         mapsector.cpp
433         mg_biome.cpp
434         mg_decoration.cpp
435         mg_ore.cpp
436         mg_schematic.cpp
437         mods.cpp
438         nameidmapping.cpp
439         nodedef.cpp
440         nodemetadata.cpp
441         nodetimer.cpp
442         noise.cpp
443         objdef.cpp
444         object_properties.cpp
445         pathfinder.cpp
446         player.cpp
447         porting.cpp
448         profiler.cpp
449         quicktune.cpp
450         reflowscan.cpp
451         remoteplayer.cpp
452         raycast.cpp
453         rollback.cpp
454         rollback_interface.cpp
455         serialization.cpp
456         server.cpp
457         serverenvironment.cpp
458         serverlist.cpp
459         serverobject.cpp
460         settings.cpp
461         socket.cpp
462         sound.cpp
463         staticobject.cpp
464         subgame.cpp
465         terminal_chat_console.cpp
466         tileanimation.cpp
467         tool.cpp
468         treegen.cpp
469         version.cpp
470         voxel.cpp
471         voxelalgorithms.cpp
472         ${common_network_SRCS}
473         ${JTHREAD_SRCS}
474         ${common_SCRIPT_SRCS}
475         ${UTIL_SRCS}
476         ${UNITTEST_SRCS}
477 )
478
479
480 # This gives us the icon and file version information
481 if(WIN32)
482         set(WINRESOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc")
483         set(MINETEST_EXE_MANIFEST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/minetest.exe.manifest")
484         if(MINGW)
485                 if(NOT CMAKE_RC_COMPILER)
486                         set(CMAKE_RC_COMPILER "windres.exe")
487                 endif()
488                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
489                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
490                         -i${WINRESOURCE_FILE}
491                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
492                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
493                         DEPENDS ${WINRESOURCE_FILE})
494                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
495         else(MINGW) # Probably MSVC
496                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE} ${MINETEST_EXE_MANIFEST_FILE})
497         endif(MINGW)
498 endif()
499
500
501 # Client sources
502 if (BUILD_CLIENT)
503         add_subdirectory(client)
504 endif(BUILD_CLIENT)
505
506 set(client_SRCS
507         ${client_SRCS}
508         ${common_SRCS}
509         ${sound_SRCS}
510         ${client_network_SRCS}
511         ${client_irrlicht_changes_SRCS}
512         camera.cpp
513         client.cpp
514         clientenvironment.cpp
515         clientmap.cpp
516         clientmedia.cpp
517         clientobject.cpp
518         clouds.cpp
519         content_cao.cpp
520         content_cso.cpp
521         content_mapblock.cpp
522         convert_json.cpp
523         drawscene.cpp
524         filecache.cpp
525         fontengine.cpp
526         game.cpp
527         guiChatConsole.cpp
528         guiEngine.cpp
529         guiFileSelectMenu.cpp
530         guiFormSpecMenu.cpp
531         guiKeyChangeMenu.cpp
532         guiPasswordChange.cpp
533         guiscalingfilter.cpp
534         guiTable.cpp
535         guiVolumeChange.cpp
536         hud.cpp
537         imagefilters.cpp
538         intlGUIEditBox.cpp
539         keycode.cpp
540         localplayer.cpp
541         main.cpp
542         mapblock_mesh.cpp
543         mesh.cpp
544         minimap.cpp
545         particles.cpp
546         shader.cpp
547         sky.cpp
548         wieldmesh.cpp
549         ${client_SCRIPT_SRCS}
550         ${UNITTEST_CLIENT_SRCS}
551 )
552 list(SORT client_SRCS)
553
554 # Server sources
555 set(server_SRCS
556         ${common_SRCS}
557         main.cpp
558 )
559 list(SORT server_SRCS)
560
561 include_directories(
562         ${PROJECT_BINARY_DIR}
563         ${PROJECT_SOURCE_DIR}
564         ${IRRLICHT_INCLUDE_DIR}
565         ${ZLIB_INCLUDE_DIR}
566         ${CMAKE_BUILD_TYPE}
567         ${PNG_INCLUDE_DIR}
568         ${GETTEXT_INCLUDE_DIR}
569         ${SOUND_INCLUDE_DIRS}
570         ${SQLITE3_INCLUDE_DIR}
571         ${LUA_INCLUDE_DIR}
572         ${GMP_INCLUDE_DIR}
573         ${JSON_INCLUDE_DIR}
574         ${X11_INCLUDE_DIR}
575         ${PROJECT_SOURCE_DIR}/script
576 )
577
578
579 if(USE_FREETYPE)
580         include_directories(${FREETYPE_INCLUDE_DIRS} ${CGUITTFONT_INCLUDE_DIR})
581 endif()
582
583 if(USE_CURL)
584         include_directories(${CURL_INCLUDE_DIR})
585 endif()
586
587
588 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
589
590
591 if(BUILD_CLIENT)
592         add_executable(${PROJECT_NAME} ${client_SRCS})
593         add_dependencies(${PROJECT_NAME} GenerateVersion)
594         set(client_LIBS
595                 ${PROJECT_NAME}
596                 ${ZLIB_LIBRARIES}
597                 ${IRRLICHT_LIBRARY}
598                 ${OPENGL_LIBRARIES}
599                 ${JPEG_LIBRARIES}
600                 ${BZIP2_LIBRARIES}
601                 ${PNG_LIBRARIES}
602                 ${X11_LIBRARIES}
603                 ${GETTEXT_LIBRARY}
604                 ${SOUND_LIBRARIES}
605                 ${SQLITE3_LIBRARY}
606                 ${LUA_LIBRARY}
607                 ${GMP_LIBRARY}
608                 ${JSON_LIBRARY}
609                 ${OPENGLES2_LIBRARIES}
610                 ${PLATFORM_LIBS}
611                 ${CLIENT_PLATFORM_LIBS}
612         )
613         if(APPLE)
614                 target_link_libraries(
615                         ${client_LIBS}
616                         ${ICONV_LIBRARY}
617                 )
618         else()
619                 target_link_libraries(
620                         ${client_LIBS}
621                 )
622         endif()
623         if(USE_CURL)
624                 target_link_libraries(
625                         ${PROJECT_NAME}
626                         ${CURL_LIBRARY}
627                 )
628         endif()
629         if(USE_FREETYPE)
630                 if(FREETYPE_PKGCONFIG_FOUND)
631                         set_target_properties(${PROJECT_NAME}
632                                 PROPERTIES
633                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
634                         )
635                 endif()
636                 target_link_libraries(
637                         ${PROJECT_NAME}
638                         ${FREETYPE_LIBRARY}
639                         ${CGUITTFONT_LIBRARY}
640                 )
641         endif()
642         if (USE_CURSES)
643                 target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES})
644         endif()
645         if (USE_POSTGRESQL)
646                 target_link_libraries(${PROJECT_NAME} ${POSTGRESQL_LIBRARY})
647         endif()
648         if (USE_LEVELDB)
649                 target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
650         endif()
651         if (USE_REDIS)
652                 target_link_libraries(${PROJECT_NAME} ${REDIS_LIBRARY})
653         endif()
654         if (USE_SPATIAL)
655                 target_link_libraries(${PROJECT_NAME} ${SPATIAL_LIBRARY})
656         endif()
657 endif(BUILD_CLIENT)
658
659
660 if(BUILD_SERVER)
661         add_executable(${PROJECT_NAME}server ${server_SRCS})
662         add_dependencies(${PROJECT_NAME}server GenerateVersion)
663         target_link_libraries(
664                 ${PROJECT_NAME}server
665                 ${ZLIB_LIBRARIES}
666                 ${SQLITE3_LIBRARY}
667                 ${JSON_LIBRARY}
668                 ${GETTEXT_LIBRARY}
669                 ${LUA_LIBRARY}
670                 ${GMP_LIBRARY}
671                 ${PLATFORM_LIBS}
672         )
673         set_target_properties(${PROJECT_NAME}server PROPERTIES
674                         COMPILE_DEFINITIONS "SERVER")
675         if (USE_CURSES)
676                 target_link_libraries(${PROJECT_NAME}server ${CURSES_LIBRARIES})
677         endif()
678         if (USE_POSTGRESQL)
679                 target_link_libraries(${PROJECT_NAME}server ${POSTGRESQL_LIBRARY})
680         endif()
681         if (USE_LEVELDB)
682                 target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
683         endif()
684         if (USE_REDIS)
685                 target_link_libraries(${PROJECT_NAME}server ${REDIS_LIBRARY})
686         endif()
687         if (USE_SPATIAL)
688                 target_link_libraries(${PROJECT_NAME}server ${SPATIAL_LIBRARY})
689         endif()
690         if(USE_CURL)
691                 target_link_libraries(
692                         ${PROJECT_NAME}server
693                         ${CURL_LIBRARY}
694                 )
695         endif()
696 endif(BUILD_SERVER)
697
698 # Blacklisted locales that don't work.
699 # see issue #4638
700 set(GETTEXT_BLACKLISTED_LOCALES
701         be
702         he
703         ko
704         ky
705         zh_CN
706         zh_TW
707 )
708
709 option(APPLY_LOCALE_BLACKLIST "Use a blacklist to avoid broken locales" TRUE)
710
711 if (GETTEXT_FOUND AND APPLY_LOCALE_BLACKLIST)
712         set(GETTEXT_USED_LOCALES "")
713         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
714                 if (NOT ";${GETTEXT_BLACKLISTED_LOCALES};" MATCHES ";${LOCALE};")
715                         list(APPEND GETTEXT_USED_LOCALES ${LOCALE})
716                 endif()
717         endforeach()
718         message(STATUS "Locale blacklist applied; Locales used: ${GETTEXT_USED_LOCALES}")
719 endif()
720
721 # Set some optimizations and tweaks
722
723 include(CheckCXXCompilerFlag)
724
725 if(MSVC)
726         # Visual Studio
727
728         # EHa enables SEH exceptions (used for catching segfaults)
729         set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /GL /FD /MT /GS- /Zi /arch:SSE /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
730         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
731         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /DEBUG /OPT:REF /OPT:ICF")
732
733         set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
734
735         # Debug build doesn't catch exceptions by itself
736         # Add some optimizations because otherwise it's VERY slow
737         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
738
739         # Flags for C files (sqlite)
740         # /MT = Link statically with standard library stuff
741         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
742 else()
743         # Probably GCC
744         if(APPLE)
745                 SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
746         endif()
747         if(WARN_ALL)
748                 set(RELEASE_WARNING_FLAGS "-Wall")
749         else()
750                 set(RELEASE_WARNING_FLAGS "")
751         endif()
752
753         if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
754                 # clang does not understand __extern_always_inline but libc headers use it
755                 set(OTHER_FLAGS "${OTHER_FLAGS} \"-D__extern_always_inline=extern __always_inline\"")
756                 set(OTHER_FLAGS "${OTHER_FLAGS} -Wsign-compare")
757         endif()
758
759         if(WIN32 AND NOT ZLIBWAPI_DLL AND CMAKE_SIZEOF_VOID_P EQUAL 4)
760                 set(OTHER_FLAGS "${OTHER_FLAGS} -DWIN32_NO_ZLIB_WINAPI")
761                 message(WARNING "Defaulting to cdecl for zlib on win32 because ZLIBWAPI_DLL"
762                         " isn't set, ensure that ZLIBWAPI_DLL is set if you want stdcall.")
763         endif()
764
765         if(MINGW)
766                 set(OTHER_FLAGS "${OTHER_FLAGS} -mthreads -fexceptions")
767         endif()
768
769         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops")
770         if(APPLE)
771                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
772         else()
773                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -fomit-frame-pointer")
774         endif(APPLE)
775         set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
776         set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
777
778         if(USE_GPROF)
779                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
780         endif()
781 endif()
782
783
784 # Installation
785
786 if(WIN32)
787         if(USE_SOUND)
788                 if(OPENAL_DLL)
789                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
790                 endif()
791                 if(OGG_DLL)
792                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
793                 endif()
794                 if(VORBIS_DLL)
795                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
796                 endif()
797                 if(VORBISFILE_DLL)
798                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
799                 endif()
800         endif()
801         if(CURL_DLL)
802                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
803         endif()
804         if(ZLIB_DLL)
805                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
806         endif()
807         if(ZLIBWAPI_DLL)
808                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
809         endif()
810         if(FREETYPE_DLL)
811                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
812         endif()
813         if(SQLITE3_DLL)
814                 install(FILES ${SQLITE3_DLL} DESTINATION ${BINDIR})
815         endif()
816         if(LEVELDB_DLL)
817                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
818         endif()
819 endif()
820
821 if(BUILD_CLIENT)
822         install(TARGETS ${PROJECT_NAME}
823                 RUNTIME DESTINATION ${BINDIR}
824                 LIBRARY DESTINATION ${BINDIR}
825                 ARCHIVE DESTINATION ${BINDIR}
826                 BUNDLE DESTINATION .
827         )
828
829         if(APPLE)
830                 install(CODE "
831                         set(BU_CHMOD_BUNDLE_ITEMS ON)
832                         include(BundleUtilities)
833                         fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${BUNDLE_PATH}\" \"\" \"\${CMAKE_INSTALL_PREFIX}/${BINDIR}\")
834                 " COMPONENT Runtime)
835         endif()
836
837         if(USE_GETTEXT)
838                 foreach(LOCALE ${GETTEXT_USED_LOCALES})
839                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
840                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
841                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
842                 endforeach()
843         endif()
844
845         if(WIN32)
846                 if(DEFINED IRRLICHT_DLL)
847                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
848                 endif()
849                 if(USE_GETTEXT)
850                         if(DEFINED GETTEXT_DLL)
851                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
852                         endif()
853                         if(DEFINED GETTEXT_ICONV_DLL)
854                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
855                         endif()
856                 endif()
857         endif()
858 endif(BUILD_CLIENT)
859
860 if(BUILD_SERVER)
861         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
862 endif()
863
864 if (USE_GETTEXT)
865         set(MO_FILES)
866
867         foreach(LOCALE ${GETTEXT_USED_LOCALES})
868                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME}.po")
869                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
870                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
871
872                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
873                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
874                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
875
876                 add_custom_command(
877                         OUTPUT ${MO_FILE_PATH}
878                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
879                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
880                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
881                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
882                         )
883
884                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
885         endforeach()
886
887         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
888 endif()
889
890
891 # Subdirectories
892
893 if (BUILD_CLIENT AND USE_FREETYPE)
894         add_subdirectory(cguittfont)
895 endif()
896