CSM: Revert "[CSM] Add send_chat_message and run_server_chatcommand"
[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         endif()
155 endif(ENABLE_FREETYPE)
156
157 option(ENABLE_CURSES "Enable ncurses console" TRUE)
158 set(USE_CURSES FALSE)
159
160 if(ENABLE_CURSES)
161         find_package(Ncursesw)
162         if(CURSES_FOUND)
163                 set(USE_CURSES TRUE)
164                 message(STATUS "ncurses console enabled.")
165                 include_directories(${CURSES_INCLUDE_DIRS})
166         else()
167                 message(STATUS "ncurses not found!")
168         endif()
169 endif(ENABLE_CURSES)
170
171 option(ENABLE_POSTGRESQL "Enable PostgreSQL backend" TRUE)
172 set(USE_POSTGRESQL FALSE)
173
174 if(ENABLE_POSTGRESQL)
175         find_program(POSTGRESQL_CONFIG_EXECUTABLE pg_config DOC "pg_config")
176         find_library(POSTGRESQL_LIBRARY pq)
177         if(POSTGRESQL_CONFIG_EXECUTABLE)
178                 execute_process(COMMAND ${POSTGRESQL_CONFIG_EXECUTABLE} --includedir-server
179                         OUTPUT_VARIABLE POSTGRESQL_SERVER_INCLUDE_DIRS
180                         OUTPUT_STRIP_TRAILING_WHITESPACE)
181                 execute_process(COMMAND ${POSTGRESQL_CONFIG_EXECUTABLE}
182                         OUTPUT_VARIABLE POSTGRESQL_CLIENT_INCLUDE_DIRS
183                         OUTPUT_STRIP_TRAILING_WHITESPACE)
184                 # This variable is case sensitive for the cmake PostgreSQL module
185                 set(PostgreSQL_ADDITIONAL_SEARCH_PATHS ${POSTGRESQL_SERVER_INCLUDE_DIRS} ${POSTGRESQL_CLIENT_INCLUDE_DIRS})
186         endif()
187
188         find_package("PostgreSQL")
189
190         if(POSTGRESQL_FOUND)
191                 set(USE_POSTGRESQL TRUE)
192                 message(STATUS "PostgreSQL backend enabled")
193                 # This variable is case sensitive, don't try to change it to POSTGRESQL_INCLUDE_DIR
194                 message(STATUS "PostgreSQL includes: ${PostgreSQL_INCLUDE_DIR}")
195                 include_directories(${PostgreSQL_INCLUDE_DIR})
196         else()
197                 message(STATUS "PostgreSQL not found!")
198         endif()
199 endif(ENABLE_POSTGRESQL)
200
201 option(ENABLE_LEVELDB "Enable LevelDB backend" TRUE)
202 set(USE_LEVELDB FALSE)
203
204 if(ENABLE_LEVELDB)
205         find_library(LEVELDB_LIBRARY leveldb)
206         find_path(LEVELDB_INCLUDE_DIR db.h PATH_SUFFIXES leveldb)
207         if(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
208                 set(USE_LEVELDB TRUE)
209                 message(STATUS "LevelDB backend enabled.")
210                 include_directories(${LEVELDB_INCLUDE_DIR})
211         else()
212                 message(STATUS "LevelDB not found!")
213         endif()
214 endif(ENABLE_LEVELDB)
215
216
217 OPTION(ENABLE_REDIS "Enable Redis backend" TRUE)
218 set(USE_REDIS FALSE)
219
220 if(ENABLE_REDIS)
221         find_library(REDIS_LIBRARY hiredis)
222         find_path(REDIS_INCLUDE_DIR hiredis.h PATH_SUFFIXES hiredis)
223         if(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
224                 set(USE_REDIS TRUE)
225                 message(STATUS "Redis backend enabled.")
226                 include_directories(${REDIS_INCLUDE_DIR})
227         else(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
228                 message(STATUS "Redis not found!")
229         endif(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
230 endif(ENABLE_REDIS)
231
232
233 find_package(SQLite3 REQUIRED)
234
235 OPTION(ENABLE_SPATIAL "Enable SpatialIndex AreaStore backend" TRUE)
236 set(USE_SPATIAL FALSE)
237
238 if(ENABLE_SPATIAL)
239         find_library(SPATIAL_LIBRARY spatialindex)
240         find_path(SPATIAL_INCLUDE_DIR spatialindex/SpatialIndex.h)
241         if(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
242                 set(USE_SPATIAL TRUE)
243                 message(STATUS "SpatialIndex AreaStore backend enabled.")
244                 include_directories(${SPATIAL_INCLUDE_DIR})
245         else(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
246                 message(STATUS "SpatialIndex not found!")
247         endif(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
248 endif(ENABLE_SPATIAL)
249
250
251 if(NOT MSVC)
252         set(USE_GPROF FALSE CACHE BOOL "Use -pg flag for g++")
253 endif()
254
255 # Use cmake_config.h
256 add_definitions(-DUSE_CMAKE_CONFIG_H)
257
258 if(WIN32)
259         # Windows
260         if(MSVC) # MSVC Specifics
261                 set(PLATFORM_LIBS dbghelp.lib ${PLATFORM_LIBS})
262                 # Surpress some useless warnings
263                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
264                 # Get M_PI to work
265                 add_definitions(/D "_USE_MATH_DEFINES")
266         else() # Probably MinGW = GCC
267                 set(PLATFORM_LIBS "")
268         endif()
269         set(PLATFORM_LIBS ws2_32.lib shlwapi.lib ${PLATFORM_LIBS})
270
271         # Zlib stuff
272         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
273                         CACHE PATH "Zlib include directory")
274         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
275                         CACHE FILEPATH "Path to zlib library (usually zlibwapi.lib)")
276         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
277                         CACHE FILEPATH "Path to zlib DLL (for installation)")
278         set(ZLIBWAPI_DLL "" CACHE FILEPATH "Path to zlibwapi DLL")
279         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
280                         CACHE PATH "irrlicht dir")
281         if(USE_FREETYPE)
282                 set(FREETYPE_INCLUDE_DIR_ft2build "${PROJECT_SOURCE_DIR}/../../freetype2/include/"
283                                 CACHE PATH "freetype include dir")
284                 set(FREETYPE_INCLUDE_DIR_freetype2 "${PROJECT_SOURCE_DIR}/../../freetype2/include/freetype"
285                                 CACHE PATH "freetype include dir")
286                 set(FREETYPE_LIBRARY "${PROJECT_SOURCE_DIR}/../../freetype2/objs/win32/vc2005/freetype247.lib"
287                                 CACHE FILEPATH "Path to freetype247.lib")
288         endif()
289         if(ENABLE_SOUND)
290                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
291                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
292                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
293                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
294         endif()
295 else()
296         # Unix probably
297         if(BUILD_CLIENT)
298                 find_package(X11 REQUIRED)
299                 find_package(OpenGL REQUIRED)
300                 find_package(JPEG REQUIRED)
301                 find_package(BZip2 REQUIRED)
302                 find_package(PNG REQUIRED)
303                 if(APPLE)
304                         find_library(CARBON_LIB Carbon)
305                         find_library(COCOA_LIB Cocoa)
306                         find_library(IOKIT_LIB IOKit)
307                         mark_as_advanced(
308                                 CARBON_LIB
309                                 COCOA_LIB
310                                 IOKIT_LIB
311                         )
312                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
313                 endif(APPLE)
314         endif(BUILD_CLIENT)
315         find_package(ZLIB REQUIRED)
316         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
317         if(APPLE)
318                 set(PLATFORM_LIBS "-framework CoreFoundation" ${PLATFORM_LIBS})
319         else()
320                 check_library_exists(rt clock_gettime "" HAVE_LIBRT)
321                 if (HAVE_LIBRT)
322                         set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
323                 endif(HAVE_LIBRT)
324         endif(APPLE)
325
326         # This way Xxf86vm is found on OpenBSD too
327         find_library(XXF86VM_LIBRARY Xxf86vm)
328         mark_as_advanced(XXF86VM_LIBRARY)
329         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
330
331         # Prefer local iconv if installed
332         find_library(ICONV_LIBRARY iconv)
333         mark_as_advanced(ICONV_LIBRARY)
334         if (ICONV_LIBRARY)
335                 set(PLATFORM_LIBS ${PLATFORM_LIBS} ${ICONV_LIBRARY})
336         endif()
337 endif()
338
339 check_include_files(endian.h HAVE_ENDIAN_H)
340
341 configure_file(
342         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
343         "${PROJECT_BINARY_DIR}/cmake_config.h"
344 )
345
346
347 # Add a target that always rebuilds cmake_config_githash.h
348 add_custom_target(GenerateVersion
349         COMMAND ${CMAKE_COMMAND}
350         -D "GENERATE_VERSION_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
351         -D "GENERATE_VERSION_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
352         -D "VERSION_STRING=${VERSION_STRING}"
353         -D "DEVELOPMENT_BUILD=${DEVELOPMENT_BUILD}"
354         -P "${CMAKE_SOURCE_DIR}/cmake/Modules/GenerateVersion.cmake"
355         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
356
357
358 add_subdirectory(threading)
359 add_subdirectory(network)
360 add_subdirectory(script)
361 add_subdirectory(unittest)
362 add_subdirectory(util)
363 add_subdirectory(irrlicht_changes)
364
365 set(common_SRCS
366         ban.cpp
367         cavegen.cpp
368         chat.cpp
369         clientiface.cpp
370         collision.cpp
371         content_mapnode.cpp
372         content_nodemeta.cpp
373         content_sao.cpp
374         convert_json.cpp
375         craftdef.cpp
376         database-dummy.cpp
377         database-files.cpp
378         database-leveldb.cpp
379         database-postgresql.cpp
380         database-redis.cpp
381         database-sqlite3.cpp
382         database.cpp
383         debug.cpp
384         defaultsettings.cpp
385         dungeongen.cpp
386         emerge.cpp
387         environment.cpp
388         face_position_cache.cpp
389         filesys.cpp
390         genericobject.cpp
391         gettext.cpp
392         httpfetch.cpp
393         inventory.cpp
394         inventorymanager.cpp
395         itemdef.cpp
396         itemstackmetadata.cpp
397         light.cpp
398         log.cpp
399         map.cpp
400         map_settings_manager.cpp
401         mapblock.cpp
402         mapgen.cpp
403         mapgen_carpathian.cpp
404         mapgen_flat.cpp
405         mapgen_fractal.cpp
406         mapgen_singlenode.cpp
407         mapgen_v5.cpp
408         mapgen_v6.cpp
409         mapgen_v7.cpp
410         mapgen_valleys.cpp
411         mapnode.cpp
412         mapsector.cpp
413         metadata.cpp
414         mg_biome.cpp
415         mg_decoration.cpp
416         mg_ore.cpp
417         mg_schematic.cpp
418         mods.cpp
419         nameidmapping.cpp
420         nodedef.cpp
421         nodemetadata.cpp
422         nodetimer.cpp
423         noise.cpp
424         objdef.cpp
425         object_properties.cpp
426         pathfinder.cpp
427         player.cpp
428         porting.cpp
429         profiler.cpp
430         quicktune.cpp
431         raycast.cpp
432         reflowscan.cpp
433         remoteplayer.cpp
434         rollback.cpp
435         rollback_interface.cpp
436         serialization.cpp
437         server.cpp
438         serverenvironment.cpp
439         serverlist.cpp
440         serverobject.cpp
441         settings.cpp
442         socket.cpp
443         sound.cpp
444         staticobject.cpp
445         subgame.cpp
446         terminal_chat_console.cpp
447         tileanimation.cpp
448         tool.cpp
449         treegen.cpp
450         version.cpp
451         voxel.cpp
452         voxelalgorithms.cpp
453         ${common_network_SRCS}
454         ${JTHREAD_SRCS}
455         ${common_SCRIPT_SRCS}
456         ${UTIL_SRCS}
457         ${UNITTEST_SRCS}
458 )
459
460
461 # This gives us the icon and file version information
462 if(WIN32)
463         set(WINRESOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc")
464         set(MINETEST_EXE_MANIFEST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/minetest.exe.manifest")
465         if(MINGW)
466                 if(NOT CMAKE_RC_COMPILER)
467                         set(CMAKE_RC_COMPILER "windres.exe")
468                 endif()
469                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
470                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
471                         -i${WINRESOURCE_FILE}
472                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
473                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
474                         DEPENDS ${WINRESOURCE_FILE})
475                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
476         else(MINGW) # Probably MSVC
477                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE} ${MINETEST_EXE_MANIFEST_FILE})
478         endif(MINGW)
479 endif()
480
481
482 # Client sources
483 if (BUILD_CLIENT)
484         add_subdirectory(client)
485 endif(BUILD_CLIENT)
486
487 set(client_SRCS
488         ${client_SRCS}
489         ${common_SRCS}
490         ${sound_SRCS}
491         ${client_network_SRCS}
492         ${client_irrlicht_changes_SRCS}
493         camera.cpp
494         client.cpp
495         clientenvironment.cpp
496         clientmap.cpp
497         clientmedia.cpp
498         clientobject.cpp
499         clouds.cpp
500         content_cao.cpp
501         content_cso.cpp
502         content_mapblock.cpp
503         convert_json.cpp
504         filecache.cpp
505         fontengine.cpp
506         game.cpp
507         guiChatConsole.cpp
508         guiEngine.cpp
509         guiPathSelectMenu.cpp
510         guiFormSpecMenu.cpp
511         guiKeyChangeMenu.cpp
512         guiPasswordChange.cpp
513         guiscalingfilter.cpp
514         guiTable.cpp
515         guiVolumeChange.cpp
516         hud.cpp
517         imagefilters.cpp
518         intlGUIEditBox.cpp
519         keycode.cpp
520         localplayer.cpp
521         main.cpp
522         mapblock_mesh.cpp
523         mesh.cpp
524         mesh_generator_thread.cpp
525         minimap.cpp
526         particles.cpp
527         shader.cpp
528         sky.cpp
529         wieldmesh.cpp
530         ${client_SCRIPT_SRCS}
531         ${UNITTEST_CLIENT_SRCS}
532 )
533 list(SORT client_SRCS)
534
535 # Server sources
536 set(server_SRCS
537         ${common_SRCS}
538         main.cpp
539 )
540 list(SORT server_SRCS)
541
542 include_directories(
543         ${PROJECT_BINARY_DIR}
544         ${PROJECT_SOURCE_DIR}
545         ${IRRLICHT_INCLUDE_DIR}
546         ${ZLIB_INCLUDE_DIR}
547         ${CMAKE_BUILD_TYPE}
548         ${PNG_INCLUDE_DIR}
549         ${GETTEXT_INCLUDE_DIR}
550         ${SOUND_INCLUDE_DIRS}
551         ${SQLITE3_INCLUDE_DIR}
552         ${LUA_INCLUDE_DIR}
553         ${GMP_INCLUDE_DIR}
554         ${JSON_INCLUDE_DIR}
555         ${X11_INCLUDE_DIR}
556         ${PROJECT_SOURCE_DIR}/script
557 )
558
559
560 if(USE_FREETYPE)
561         include_directories(${FREETYPE_INCLUDE_DIRS})
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                 )
621         endif()
622         if (USE_CURSES)
623                 target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES})
624         endif()
625         if (USE_POSTGRESQL)
626                 target_link_libraries(${PROJECT_NAME} ${POSTGRESQL_LIBRARY})
627         endif()
628         if (USE_LEVELDB)
629                 target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
630         endif()
631         if (USE_REDIS)
632                 target_link_libraries(${PROJECT_NAME} ${REDIS_LIBRARY})
633         endif()
634         if (USE_SPATIAL)
635                 target_link_libraries(${PROJECT_NAME} ${SPATIAL_LIBRARY})
636         endif()
637 endif(BUILD_CLIENT)
638
639
640 if(BUILD_SERVER)
641         add_executable(${PROJECT_NAME}server ${server_SRCS})
642         add_dependencies(${PROJECT_NAME}server GenerateVersion)
643         target_link_libraries(
644                 ${PROJECT_NAME}server
645                 ${ZLIB_LIBRARIES}
646                 ${SQLITE3_LIBRARY}
647                 ${JSON_LIBRARY}
648                 ${GETTEXT_LIBRARY}
649                 ${LUA_LIBRARY}
650                 ${GMP_LIBRARY}
651                 ${PLATFORM_LIBS}
652         )
653         set_target_properties(${PROJECT_NAME}server PROPERTIES
654                         COMPILE_DEFINITIONS "SERVER")
655         if (USE_CURSES)
656                 target_link_libraries(${PROJECT_NAME}server ${CURSES_LIBRARIES})
657         endif()
658         if (USE_POSTGRESQL)
659                 target_link_libraries(${PROJECT_NAME}server ${POSTGRESQL_LIBRARY})
660         endif()
661         if (USE_LEVELDB)
662                 target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
663         endif()
664         if (USE_REDIS)
665                 target_link_libraries(${PROJECT_NAME}server ${REDIS_LIBRARY})
666         endif()
667         if (USE_SPATIAL)
668                 target_link_libraries(${PROJECT_NAME}server ${SPATIAL_LIBRARY})
669         endif()
670         if(USE_CURL)
671                 target_link_libraries(
672                         ${PROJECT_NAME}server
673                         ${CURL_LIBRARY}
674                 )
675         endif()
676 endif(BUILD_SERVER)
677
678 # Blacklisted locales that don't work.
679 # see issue #4638
680 set(GETTEXT_BLACKLISTED_LOCALES
681         be
682         he
683         ko
684         ky
685         zh_CN
686         zh_TW
687 )
688
689 option(APPLY_LOCALE_BLACKLIST "Use a blacklist to avoid broken locales" TRUE)
690
691 if (GETTEXT_FOUND AND APPLY_LOCALE_BLACKLIST)
692         set(GETTEXT_USED_LOCALES "")
693         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
694                 if (NOT ";${GETTEXT_BLACKLISTED_LOCALES};" MATCHES ";${LOCALE};")
695                         list(APPEND GETTEXT_USED_LOCALES ${LOCALE})
696                 endif()
697         endforeach()
698         message(STATUS "Locale blacklist applied; Locales used: ${GETTEXT_USED_LOCALES}")
699 endif()
700
701 # Set some optimizations and tweaks
702
703 include(CheckCXXCompilerFlag)
704
705 if(MSVC)
706         # Visual Studio
707         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D WIN32_LEAN_AND_MEAN /MP")
708         # EHa enables SEH exceptions (used for catching segfaults)
709         set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /GL /FD /MT /GS- /Zi /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
710         if(CMAKE_SIZEOF_VOID_P EQUAL 4)
711                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /arch:SSE")
712         endif()
713         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
714         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF")
715
716
717         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
718
719
720         set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
721
722         # Debug build doesn't catch exceptions by itself
723         # Add some optimizations because otherwise it's VERY slow
724         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
725
726         # Flags for C files (sqlite)
727         # /MT = Link statically with standard library stuff
728         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
729 else()
730         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
731         # Probably GCC
732         if(APPLE)
733                 SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
734         endif()
735         if(WARN_ALL)
736                 set(RELEASE_WARNING_FLAGS "-Wall")
737         else()
738                 set(RELEASE_WARNING_FLAGS "")
739         endif()
740
741         if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
742                 # clang does not understand __extern_always_inline but libc headers use it
743                 set(OTHER_FLAGS "${OTHER_FLAGS} \"-D__extern_always_inline=extern __always_inline\"")
744                 set(OTHER_FLAGS "${OTHER_FLAGS} -Wsign-compare")
745         endif()
746
747         if(WIN32 AND NOT ZLIBWAPI_DLL AND CMAKE_SIZEOF_VOID_P EQUAL 4)
748                 set(OTHER_FLAGS "${OTHER_FLAGS} -DWIN32_NO_ZLIB_WINAPI")
749                 message(WARNING "Defaulting to cdecl for zlib on win32 because ZLIBWAPI_DLL"
750                         " isn't set, ensure that ZLIBWAPI_DLL is set if you want stdcall.")
751         endif()
752
753         if(MINGW)
754                 set(OTHER_FLAGS "${OTHER_FLAGS} -mthreads -fexceptions")
755                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWIN32_LEAN_AND_MEAN")
756         endif()
757
758         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -Wall -pipe -funroll-loops")
759         if(CMAKE_SYSTEM_NAME MATCHES "(Darwin|FreeBSD)")
760                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
761         else()
762                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -ffast-math -fomit-frame-pointer")
763         endif(CMAKE_SYSTEM_NAME MATCHES "(Darwin|FreeBSD)")
764         set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
765         set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
766
767         if(USE_GPROF)
768                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
769         endif()
770
771         if(MINGW)
772                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mwindows")
773         endif()
774 endif()
775
776
777 # Installation
778
779 if(WIN32)
780         if(USE_SOUND)
781                 if(OPENAL_DLL)
782                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
783                 endif()
784                 if(OGG_DLL)
785                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
786                 endif()
787                 if(VORBIS_DLL)
788                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
789                 endif()
790                 if(VORBISFILE_DLL)
791                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
792                 endif()
793         endif()
794         if(CURL_DLL)
795                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
796         endif()
797         if(ZLIB_DLL)
798                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
799         endif()
800         if(ZLIBWAPI_DLL)
801                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
802         endif()
803         if(FREETYPE_DLL)
804                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
805         endif()
806         if(SQLITE3_DLL)
807                 install(FILES ${SQLITE3_DLL} DESTINATION ${BINDIR})
808         endif()
809         if(LEVELDB_DLL)
810                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
811         endif()
812 endif()
813
814 if(BUILD_CLIENT)
815         install(TARGETS ${PROJECT_NAME}
816                 RUNTIME DESTINATION ${BINDIR}
817                 LIBRARY DESTINATION ${BINDIR}
818                 ARCHIVE DESTINATION ${BINDIR}
819                 BUNDLE DESTINATION .
820         )
821
822         if(APPLE)
823                 install(CODE "
824                         set(BU_CHMOD_BUNDLE_ITEMS ON)
825                         include(BundleUtilities)
826                         fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${BUNDLE_PATH}\" \"\" \"\${CMAKE_INSTALL_PREFIX}/${BINDIR}\")
827                 " COMPONENT Runtime)
828         endif()
829
830         if(USE_GETTEXT)
831                 foreach(LOCALE ${GETTEXT_USED_LOCALES})
832                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
833                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
834                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
835                 endforeach()
836         endif()
837
838         if(WIN32)
839                 if(DEFINED IRRLICHT_DLL)
840                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
841                 endif()
842                 if(USE_GETTEXT)
843                         if(DEFINED GETTEXT_DLL)
844                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
845                         endif()
846                         if(DEFINED GETTEXT_ICONV_DLL)
847                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
848                         endif()
849                 endif()
850         endif()
851 endif(BUILD_CLIENT)
852
853 if(BUILD_SERVER)
854         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
855 endif()
856
857 if (USE_GETTEXT)
858         set(MO_FILES)
859
860         foreach(LOCALE ${GETTEXT_USED_LOCALES})
861                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME}.po")
862                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
863                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
864
865                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
866                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
867                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
868
869                 add_custom_command(
870                         OUTPUT ${MO_FILE_PATH}
871                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
872                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
873                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
874                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
875                         )
876
877                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
878         endforeach()
879
880         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
881 endif()