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