]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
Mapgen: Don't spread light of nodes outside the desired area
[minetest.git] / src / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.6)
2
3 project(minetest)
4
5 INCLUDE(CheckIncludeFiles)
6
7 # Add custom SemiDebug build mode
8 set(CMAKE_CXX_FLAGS_SEMIDEBUG "-O1 -g -Wall -Wabi" CACHE STRING
9         "Flags used by the C++ compiler during semidebug builds."
10         FORCE
11 )
12 set(CMAKE_C_FLAGS_SEMIDEBUG "-O1 -g -Wall -pedantic" CACHE STRING
13         "Flags used by the C compiler during semidebug builds."
14         FORCE
15 )
16 mark_as_advanced(
17         CMAKE_CXX_FLAGS_SEMIDEBUG
18         CMAKE_C_FLAGS_SEMIDEBUG
19 )
20 set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING
21         "Choose the type of build. Options are: None Debug SemiDebug RelWithDebInfo MinSizeRel."
22         FORCE
23 )
24
25
26 # Set some random things default to not being visible in the GUI
27 mark_as_advanced(EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH)
28
29
30 if(NOT (BUILD_CLIENT OR BUILD_SERVER))
31         message(WARNING "Neither BUILD_CLIENT nor BUILD_SERVER is set! Setting BUILD_SERVER=true")
32         set(BUILD_SERVER TRUE)
33 endif()
34
35
36 option(ENABLE_CURL "Enable cURL support for fetching media" TRUE)
37 set(USE_CURL FALSE)
38
39 if(ENABLE_CURL)
40         find_package(CURL)
41         if (CURL_FOUND)
42                 message(STATUS "cURL support enabled.")
43                 set(USE_CURL TRUE)
44         endif()
45 else()
46         mark_as_advanced(CLEAR CURL_LIBRARY CURL_INCLUDE_DIR)
47 endif()
48
49 if(NOT USE_CURL)
50         if(BUILD_CLIENT)
51                 message(WARNING "cURL is required to load the server list")
52         endif()
53         if(BUILD_SERVER)
54                 message(WARNING "cURL is required to announce to the server list")
55         endif()
56 endif()
57
58
59 option(ENABLE_GETTEXT "Use GetText for internationalization" FALSE)
60 set(USE_GETTEXT FALSE)
61
62 if(ENABLE_GETTEXT)
63         find_package(GettextLib)
64         if(GETTEXT_FOUND)
65                 if(WIN32)
66                         message(STATUS "GetText library: ${GETTEXT_LIBRARY}")
67                         message(STATUS "GetText DLL: ${GETTEXT_DLL}")
68                         message(STATUS "GetText iconv DLL: ${GETTEXT_ICONV_DLL}")
69                 endif()
70                 set(USE_GETTEXT TRUE)
71                 message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
72         endif(GETTEXT_FOUND)
73 else()
74         mark_as_advanced(GETTEXT_ICONV_DLL GETTEXT_INCLUDE_DIR GETTEXT_LIBRARY GETTEXT_MSGFMT)
75         message(STATUS "GetText disabled.")
76 endif()
77
78
79 option(ENABLE_SOUND "Enable sound" TRUE)
80 set(USE_SOUND FALSE)
81
82 if(BUILD_CLIENT AND ENABLE_SOUND)
83         # Sound libraries
84         find_package(OpenAL)
85         find_package(Vorbis)
86         if(NOT OPENAL_FOUND)
87                 message(STATUS "Sound enabled, but OpenAL not found!")
88                 mark_as_advanced(CLEAR OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
89         endif()
90         if(NOT VORBIS_FOUND)
91                 message(STATUS "Sound enabled, but Vorbis libraries not found!")
92                 mark_as_advanced(CLEAR OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)
93         endif()
94         if(OPENAL_FOUND AND VORBIS_FOUND)
95                 set(USE_SOUND TRUE)
96                 message(STATUS "Sound enabled.")
97         else()
98                 message(FATAL_ERROR "Sound enabled, but cannot be used.\n"
99                         "To continue, either fill in the required paths or disable sound. (-DENABLE_SOUND=0)")
100         endif()
101 endif()
102
103 if(USE_SOUND)
104         set(sound_SRCS sound_openal.cpp)
105         set(SOUND_INCLUDE_DIRS
106                 ${OPENAL_INCLUDE_DIR}
107                 ${VORBIS_INCLUDE_DIR}
108                 ${OGG_INCLUDE_DIR}
109                 )
110         set(SOUND_LIBRARIES
111                 ${OPENAL_LIBRARY}
112                 ${VORBIS_LIBRARIES}
113                 )
114 endif()
115
116
117 option(ENABLE_GLES "Enable OpenGL ES support" FALSE)
118 mark_as_advanced(ENABLE_GLES)
119 if(ENABLE_GLES)
120         find_package(OpenGLES2)
121 endif()
122
123
124 option(ENABLE_FREETYPE "Enable FreeType2 (TrueType fonts and basic unicode support)" TRUE)
125 set(USE_FREETYPE FALSE)
126
127 if(ENABLE_FREETYPE)
128 ##
129 ## Note: FindFreetype.cmake seems to have been fixed in recent versions of
130 ## CMake. If issues persist, re-enable this workaround specificially for the
131 ## failing platforms.
132 ##
133 #       if(UNIX)
134 #               include(FindPkgConfig)
135 #               if(PKG_CONFIG_FOUND)
136 #                       pkg_check_modules(FREETYPE QUIET freetype2)
137 #                       if(FREETYPE_FOUND)
138 #                               SET(FREETYPE_PKGCONFIG_FOUND TRUE)
139 #                               SET(FREETYPE_LIBRARY ${FREETYPE_LIBRARIES})
140 #                               # Because CMake is idiotic
141 #                               string(REPLACE ";" " " FREETYPE_CFLAGS_STR ${FREETYPE_CFLAGS})
142 #                               string(REPLACE ";" " " FREETYPE_LDFLAGS_STR ${FREETYPE_LDFLAGS})
143 #                       endif(FREETYPE_FOUND)
144 #               endif(PKG_CONFIG_FOUND)
145 #       endif(UNIX)
146 #       if(NOT FREETYPE_FOUND)
147 #               find_package(Freetype)
148 #       endif()
149         find_package(Freetype)
150         if(FREETYPE_FOUND)
151                 message(STATUS "Freetype enabled.")
152                 set(USE_FREETYPE TRUE)
153                 set(CGUITTFONT_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cguittfont")
154                 set(CGUITTFONT_LIBRARY cguittfont)
155         endif()
156 endif(ENABLE_FREETYPE)
157
158 # LuaJIT
159 option(ENABLE_LUAJIT "Enable LuaJIT support" TRUE)
160 set(USE_LUAJIT FALSE)
161 if(ENABLE_LUAJIT)
162         find_package(LuaJIT)
163         if(LUAJIT_FOUND)
164                 set(USE_LUAJIT TRUE)
165         endif(LUAJIT_FOUND)
166 else()
167         message (STATUS "LuaJIT detection disabled! (ENABLE_LUAJIT=0)")
168 endif()
169 if(NOT USE_LUAJIT)
170         message(STATUS "LuaJIT not found, using bundled Lua.")
171         set(LUA_LIBRARY "lua")
172         set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
173         add_subdirectory(lua)
174 endif()
175
176 find_package(GMP REQUIRED)
177
178 option(ENABLE_CURSES "Enable ncurses console" TRUE)
179 set(USE_CURSES FALSE)
180
181 if(ENABLE_CURSES)
182         find_package(Ncursesw)
183         if(CURSES_FOUND)
184                 set(USE_CURSES TRUE)
185                 message(STATUS "ncurses console enabled.")
186                 include_directories(${CURSES_INCLUDE_DIRS})
187         else()
188                 message(STATUS "ncurses not found!")
189         endif()
190 endif(ENABLE_CURSES)
191
192 option(ENABLE_LEVELDB "Enable LevelDB backend" TRUE)
193 set(USE_LEVELDB FALSE)
194
195 if(ENABLE_LEVELDB)
196         find_library(LEVELDB_LIBRARY leveldb)
197         find_path(LEVELDB_INCLUDE_DIR db.h PATH_SUFFIXES leveldb)
198         if(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
199                 set(USE_LEVELDB TRUE)
200                 message(STATUS "LevelDB backend enabled.")
201                 include_directories(${LEVELDB_INCLUDE_DIR})
202         else()
203                 message(STATUS "LevelDB not found!")
204         endif()
205 endif(ENABLE_LEVELDB)
206
207
208 OPTION(ENABLE_REDIS "Enable Redis backend" TRUE)
209 set(USE_REDIS FALSE)
210
211 if(ENABLE_REDIS)
212         find_library(REDIS_LIBRARY hiredis)
213         find_path(REDIS_INCLUDE_DIR hiredis.h PATH_SUFFIXES hiredis)
214         if(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
215                 set(USE_REDIS TRUE)
216                 message(STATUS "Redis backend enabled.")
217                 include_directories(${REDIS_INCLUDE_DIR})
218         else(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
219                 message(STATUS "Redis not found!")
220         endif(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
221 endif(ENABLE_REDIS)
222
223
224 find_package(SQLite3 REQUIRED)
225 find_package(Json REQUIRED)
226
227 OPTION(ENABLE_SPATIAL "Enable SpatialIndex AreaStore backend" TRUE)
228 set(USE_SPATIAL FALSE)
229
230 if(ENABLE_SPATIAL)
231         find_library(SPATIAL_LIBRARY spatialindex)
232         find_path(SPATIAL_INCLUDE_DIR spatialindex/SpatialIndex.h)
233         if(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
234                 set(USE_SPATIAL TRUE)
235                 message(STATUS "SpatialIndex AreaStore backend enabled.")
236                 include_directories(${SPATIAL_INCLUDE_DIR})
237         else(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
238                 message(STATUS "SpatialIndex not found!")
239         endif(SPATIAL_LIBRARY AND SPATIAL_INCLUDE_DIR)
240 endif(ENABLE_SPATIAL)
241
242
243 if(NOT MSVC)
244         set(USE_GPROF FALSE CACHE BOOL "Use -pg flag for g++")
245 endif()
246
247 # Use cmake_config.h
248 add_definitions(-DUSE_CMAKE_CONFIG_H)
249
250 if(WIN32)
251         # Windows
252         if(MSVC) # MSVC Specifics
253                 set(PLATFORM_LIBS dbghelp.lib ${PLATFORM_LIBS})
254                 # Surpress some useless warnings
255                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
256         else() # Probably MinGW = GCC
257                 set(PLATFORM_LIBS "")
258         endif()
259         set(PLATFORM_LIBS ws2_32.lib shlwapi.lib ${PLATFORM_LIBS})
260
261         # Zlib stuff
262         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
263                         CACHE PATH "Zlib include directory")
264         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
265                         CACHE FILEPATH "Path to zlibwapi.lib")
266         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
267                         CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
268         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
269                         CACHE PATH "irrlicht dir")
270         if(USE_FREETYPE)
271                 set(FREETYPE_INCLUDE_DIR_ft2build "${PROJECT_SOURCE_DIR}/../../freetype2/include/"
272                                 CACHE PATH "freetype include dir")
273                 set(FREETYPE_INCLUDE_DIR_freetype2 "${PROJECT_SOURCE_DIR}/../../freetype2/include/freetype"
274                                 CACHE PATH "freetype include dir")
275                 set(FREETYPE_LIBRARY "${PROJECT_SOURCE_DIR}/../../freetype2/objs/win32/vc2005/freetype247.lib"
276                                 CACHE FILEPATH "Path to freetype247.lib")
277         endif()
278         if(ENABLE_SOUND)
279                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
280                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
281                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
282                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
283         endif()
284 else()
285         # Unix probably
286         if(BUILD_CLIENT)
287                 find_package(X11 REQUIRED)
288                 find_package(OpenGL REQUIRED)
289                 find_package(JPEG REQUIRED)
290                 find_package(BZip2 REQUIRED)
291                 find_package(PNG REQUIRED)
292                 if(APPLE)
293                         find_library(CARBON_LIB Carbon)
294                         find_library(COCOA_LIB Cocoa)
295                         find_library(IOKIT_LIB IOKit)
296                         mark_as_advanced(
297                                 CARBON_LIB
298                                 COCOA_LIB
299                                 IOKIT_LIB
300                         )
301                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
302                 endif(APPLE)
303         endif(BUILD_CLIENT)
304         find_package(ZLIB REQUIRED)
305         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
306         if(APPLE)
307                 set(PLATFORM_LIBS "-framework CoreFoundation" ${PLATFORM_LIBS})
308         else()
309                 set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
310         endif(APPLE)
311
312         # This way Xxf86vm is found on OpenBSD too
313         find_library(XXF86VM_LIBRARY Xxf86vm)
314         mark_as_advanced(XXF86VM_LIBRARY)
315         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
316
317         # Prefer local iconv if installed
318         find_library(ICONV_LIBRARY iconv)
319         mark_as_advanced(ICONV_LIBRARY)
320         if (ICONV_LIBRARY)
321                 set(PLATFORM_LIBS ${PLATFORM_LIBS} ${ICONV_LIBRARY})
322         endif()
323 endif()
324
325 check_include_files(endian.h HAVE_ENDIAN_H)
326
327 configure_file(
328         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
329         "${PROJECT_BINARY_DIR}/cmake_config.h"
330 )
331
332
333 # Add a target that always rebuilds cmake_config_githash.h
334 add_custom_target(GenerateVersion
335         COMMAND ${CMAKE_COMMAND}
336         -D "GENERATE_VERSION_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
337         -D "GENERATE_VERSION_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
338         -D "VERSION_STRING=${VERSION_STRING}"
339         -D "DEVELOPMENT_BUILD=${DEVELOPMENT_BUILD}"
340         -P "${CMAKE_SOURCE_DIR}/cmake/Modules/GenerateVersion.cmake"
341         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
342
343
344 add_subdirectory(threading)
345 add_subdirectory(network)
346 add_subdirectory(script)
347 add_subdirectory(unittest)
348 add_subdirectory(util)
349
350 set(common_SRCS
351         ban.cpp
352         cavegen.cpp
353         chat.cpp
354         clientiface.cpp
355         collision.cpp
356         content_abm.cpp
357         content_mapnode.cpp
358         content_nodemeta.cpp
359         content_sao.cpp
360         convert_json.cpp
361         craftdef.cpp
362         database-dummy.cpp
363         database-leveldb.cpp
364         database-redis.cpp
365         database-sqlite3.cpp
366         database.cpp
367         debug.cpp
368         defaultsettings.cpp
369         dungeongen.cpp
370         emerge.cpp
371         environment.cpp
372         filesys.cpp
373         genericobject.cpp
374         gettext.cpp
375         httpfetch.cpp
376         inventory.cpp
377         inventorymanager.cpp
378         itemdef.cpp
379         light.cpp
380         log.cpp
381         map.cpp
382         mapblock.cpp
383         mapgen.cpp
384         mapgen_flat.cpp
385         mapgen_fractal.cpp
386         mapgen_singlenode.cpp
387         mapgen_v5.cpp
388         mapgen_v6.cpp
389         mapgen_v7.cpp
390         mapgen_valleys.cpp
391         mapnode.cpp
392         mapsector.cpp
393         mg_biome.cpp
394         mg_decoration.cpp
395         mg_ore.cpp
396         mg_schematic.cpp
397         mods.cpp
398         nameidmapping.cpp
399         nodedef.cpp
400         nodemetadata.cpp
401         nodetimer.cpp
402         noise.cpp
403         objdef.cpp
404         object_properties.cpp
405         pathfinder.cpp
406         player.cpp
407         porting.cpp
408         profiler.cpp
409         quicktune.cpp
410         rollback.cpp
411         rollback_interface.cpp
412         serialization.cpp
413         server.cpp
414         serverlist.cpp
415         serverobject.cpp
416         settings.cpp
417         socket.cpp
418         sound.cpp
419         staticobject.cpp
420         subgame.cpp
421         terminal_chat_console.cpp
422         tool.cpp
423         treegen.cpp
424         version.cpp
425         voxel.cpp
426         voxelalgorithms.cpp
427         ${common_network_SRCS}
428         ${JTHREAD_SRCS}
429         ${common_SCRIPT_SRCS}
430         ${UTIL_SRCS}
431         ${UNITTEST_SRCS}
432 )
433
434
435 # This gives us the icon and file version information
436 if(WIN32)
437         set(WINRESOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc")
438         if(MINGW)
439                 if(NOT CMAKE_RC_COMPILER)
440                         set(CMAKE_RC_COMPILER "windres.exe")
441                 endif()
442                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
443                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
444                         -i${WINRESOURCE_FILE}
445                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
446                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
447                         DEPENDS ${WINRESOURCE_FILE})
448                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
449         else(MINGW) # Probably MSVC
450                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
451         endif(MINGW)
452 endif()
453
454
455 # Client sources
456 if (BUILD_CLIENT)
457         add_subdirectory(client)
458 endif(BUILD_CLIENT)
459
460 set(client_SRCS
461         ${client_SRCS}
462         ${common_SRCS}
463         ${sound_SRCS}
464         ${client_network_SRCS}
465         camera.cpp
466         client.cpp
467         clientmap.cpp
468         clientmedia.cpp
469         clientobject.cpp
470         clouds.cpp
471         content_cao.cpp
472         content_cso.cpp
473         content_mapblock.cpp
474         convert_json.cpp
475         drawscene.cpp
476         filecache.cpp
477         fontengine.cpp
478         game.cpp
479         guiChatConsole.cpp
480         guiEngine.cpp
481         guiFileSelectMenu.cpp
482         guiFormSpecMenu.cpp
483         guiKeyChangeMenu.cpp
484         guiPasswordChange.cpp
485         guiscalingfilter.cpp
486         guiTable.cpp
487         guiVolumeChange.cpp
488         hud.cpp
489         imagefilters.cpp
490         intlGUIEditBox.cpp
491         keycode.cpp
492         localplayer.cpp
493         main.cpp
494         mapblock_mesh.cpp
495         mesh.cpp
496         minimap.cpp
497         particles.cpp
498         shader.cpp
499         sky.cpp
500         wieldmesh.cpp
501         ${client_SCRIPT_SRCS}
502 )
503 list(SORT client_SRCS)
504
505 # Server sources
506 set(server_SRCS
507         ${common_SRCS}
508         main.cpp
509 )
510 list(SORT server_SRCS)
511
512 include_directories(
513         ${PROJECT_BINARY_DIR}
514         ${PROJECT_SOURCE_DIR}
515         ${IRRLICHT_INCLUDE_DIR}
516         ${ZLIB_INCLUDE_DIR}
517         ${CMAKE_BUILD_TYPE}
518         ${PNG_INCLUDE_DIR}
519         ${GETTEXT_INCLUDE_DIR}
520         ${SOUND_INCLUDE_DIRS}
521         ${SQLITE3_INCLUDE_DIR}
522         ${LUA_INCLUDE_DIR}
523         ${GMP_INCLUDE_DIR}
524         ${JSON_INCLUDE_DIR}
525         ${PROJECT_SOURCE_DIR}/script
526 )
527
528
529 if(USE_FREETYPE)
530         include_directories(${FREETYPE_INCLUDE_DIRS} ${CGUITTFONT_INCLUDE_DIR})
531 endif()
532
533 if(USE_CURL)
534         include_directories(${CURL_INCLUDE_DIR})
535 endif()
536
537
538 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
539
540
541 if(BUILD_CLIENT)
542         add_executable(${PROJECT_NAME} ${client_SRCS})
543         add_dependencies(${PROJECT_NAME} GenerateVersion)
544         set(client_LIBS
545                 ${PROJECT_NAME}
546                 ${ZLIB_LIBRARIES}
547                 ${IRRLICHT_LIBRARY}
548                 ${OPENGL_LIBRARIES}
549                 ${JPEG_LIBRARIES}
550                 ${BZIP2_LIBRARIES}
551                 ${PNG_LIBRARIES}
552                 ${X11_LIBRARIES}
553                 ${GETTEXT_LIBRARY}
554                 ${SOUND_LIBRARIES}
555                 ${SQLITE3_LIBRARY}
556                 ${LUA_LIBRARY}
557                 ${GMP_LIBRARY}
558                 ${JSON_LIBRARY}
559                 ${OPENGLES2_LIBRARIES}
560                 ${PLATFORM_LIBS}
561                 ${CLIENT_PLATFORM_LIBS}
562         )
563         if(APPLE)
564                 target_link_libraries(
565                         ${client_LIBS}
566                         ${ICONV_LIBRARY}
567                 )
568         else()
569                 target_link_libraries(
570                         ${client_LIBS}
571                 )
572         endif()
573         if(USE_CURL)
574                 target_link_libraries(
575                         ${PROJECT_NAME}
576                         ${CURL_LIBRARY}
577                 )
578         endif()
579         if(USE_FREETYPE)
580                 if(FREETYPE_PKGCONFIG_FOUND)
581                         set_target_properties(${PROJECT_NAME}
582                                 PROPERTIES
583                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
584                         )
585                 endif()
586                 target_link_libraries(
587                         ${PROJECT_NAME}
588                         ${FREETYPE_LIBRARY}
589                         ${CGUITTFONT_LIBRARY}
590                 )
591         endif()
592         if (USE_CURSES)
593                 target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES})
594         endif()
595         if (USE_LEVELDB)
596                 target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
597         endif()
598         if (USE_REDIS)
599                 target_link_libraries(${PROJECT_NAME} ${REDIS_LIBRARY})
600         endif()
601         if (USE_SPATIAL)
602                 target_link_libraries(${PROJECT_NAME} ${SPATIAL_LIBRARY})
603         endif()
604 endif(BUILD_CLIENT)
605
606
607 if(BUILD_SERVER)
608         add_executable(${PROJECT_NAME}server ${server_SRCS})
609         add_dependencies(${PROJECT_NAME}server GenerateVersion)
610         target_link_libraries(
611                 ${PROJECT_NAME}server
612                 ${ZLIB_LIBRARIES}
613                 ${SQLITE3_LIBRARY}
614                 ${JSON_LIBRARY}
615                 ${GETTEXT_LIBRARY}
616                 ${LUA_LIBRARY}
617                 ${GMP_LIBRARY}
618                 ${PLATFORM_LIBS}
619         )
620         set_target_properties(${PROJECT_NAME}server PROPERTIES
621                         COMPILE_DEFINITIONS "SERVER")
622         if (USE_CURSES)
623                 target_link_libraries(${PROJECT_NAME}server ${CURSES_LIBRARIES})
624         endif()
625         if (USE_LEVELDB)
626                 target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
627         endif()
628         if (USE_REDIS)
629                 target_link_libraries(${PROJECT_NAME}server ${REDIS_LIBRARY})
630         endif()
631         if (USE_SPATIAL)
632                 target_link_libraries(${PROJECT_NAME}server ${SPATIAL_LIBRARY})
633         endif()
634         if(USE_CURL)
635                 target_link_libraries(
636                         ${PROJECT_NAME}server
637                         ${CURL_LIBRARY}
638                 )
639         endif()
640 endif(BUILD_SERVER)
641
642
643 # Set some optimizations and tweaks
644
645 include(CheckCXXCompilerFlag)
646
647 if(MSVC)
648         # Visual Studio
649
650         # EHa enables SEH exceptions (used for catching segfaults)
651         set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /Ob2 /Oi /Ot /Oy /GL /FD /MT /GS- /arch:SSE /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
652         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
653         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
654
655         set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
656
657         # Debug build doesn't catch exceptions by itself
658         # Add some optimizations because otherwise it's VERY slow
659         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
660
661         # Flags for C files (sqlite)
662         # /MT = Link statically with standard library stuff
663         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
664 else()
665         # Probably GCC
666         if(APPLE)
667                 SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
668         endif()
669         if(WARN_ALL)
670                 set(RELEASE_WARNING_FLAGS "-Wall")
671         else()
672                 set(RELEASE_WARNING_FLAGS "")
673         endif()
674
675         if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
676                 # clang does not understand __extern_always_inline but libc headers use it
677                 set(OTHER_FLAGS "${OTHER_FLAGS} \"-D__extern_always_inline=extern __always_inline\"")
678                 set(OTHER_FLAGS "${OTHER_FLAGS} -Wsign-compare")
679         endif()
680
681         if(MINGW)
682                 set(OTHER_FLAGS "-mthreads -fexceptions")
683         endif()
684
685         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops")
686         if(APPLE)
687                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
688         else()
689                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -fomit-frame-pointer")
690         endif(APPLE)
691         set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
692         set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
693
694         if(USE_GPROF)
695                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
696         endif()
697 endif()
698
699
700 # Installation
701
702 if(WIN32)
703         if(USE_SOUND)
704                 if(OPENAL_DLL)
705                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
706                 endif()
707                 if(OGG_DLL)
708                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
709                 endif()
710                 if(VORBIS_DLL)
711                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
712                 endif()
713                 if(VORBISFILE_DLL)
714                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
715                 endif()
716         endif()
717         if(CURL_DLL)
718                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
719         endif()
720         if(ZLIB_DLL)
721                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
722         endif()
723         if(ZLIBWAPI_DLL)
724                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
725         endif()
726         if(FREETYPE_DLL)
727                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
728         endif()
729         if(SQLITE3_DLL)
730                 install(FILES ${SQLITE3_DLL} DESTINATION ${BINDIR})
731         endif()
732         if(LEVELDB_DLL)
733                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
734         endif()
735 endif()
736
737 if(BUILD_CLIENT)
738         install(TARGETS ${PROJECT_NAME}
739                 RUNTIME DESTINATION ${BINDIR}
740                 LIBRARY DESTINATION ${BINDIR}
741                 ARCHIVE DESTINATION ${BINDIR}
742                 BUNDLE DESTINATION .
743         )
744
745         if(APPLE)
746                 install(CODE "
747                         set(BU_CHMOD_BUNDLE_ITEMS ON)
748                         include(BundleUtilities)
749                         fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${BUNDLE_PATH}\" \"\" \"\${CMAKE_INSTALL_PREFIX}/${BINDIR}\")
750                 " COMPONENT Runtime)
751         endif()
752
753         if(USE_GETTEXT)
754                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
755                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
756                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
757                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
758                 endforeach()
759         endif()
760
761         if(WIN32)
762                 if(DEFINED IRRLICHT_DLL)
763                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
764                 endif()
765                 if(USE_GETTEXT)
766                         if(DEFINED GETTEXT_DLL)
767                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
768                         endif()
769                         if(DEFINED GETTEXT_ICONV_DLL)
770                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
771                         endif()
772                 endif()
773         endif()
774 endif(BUILD_CLIENT)
775
776 if(BUILD_SERVER)
777         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
778 endif()
779
780 if (USE_GETTEXT)
781         set(MO_FILES)
782
783         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
784                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME}.po")
785                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
786                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
787
788                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
789                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
790                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
791
792                 add_custom_command(
793                         OUTPUT ${MO_FILE_PATH}
794                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
795                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
796                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
797                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
798                         )
799
800                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
801         endforeach()
802
803         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
804 endif()
805
806
807 # Subdirectories
808
809 if (BUILD_CLIENT AND USE_FREETYPE)
810         add_subdirectory(cguittfont)
811 endif()
812