]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
Add Valleys mapgen.
[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         areastore.cpp
352         ban.cpp
353         cavegen.cpp
354         chat.cpp
355         clientiface.cpp
356         collision.cpp
357         content_abm.cpp
358         content_mapnode.cpp
359         content_nodemeta.cpp
360         content_sao.cpp
361         convert_json.cpp
362         craftdef.cpp
363         database-dummy.cpp
364         database-leveldb.cpp
365         database-redis.cpp
366         database-sqlite3.cpp
367         database.cpp
368         debug.cpp
369         defaultsettings.cpp
370         dungeongen.cpp
371         emerge.cpp
372         environment.cpp
373         filesys.cpp
374         genericobject.cpp
375         gettext.cpp
376         httpfetch.cpp
377         inventory.cpp
378         inventorymanager.cpp
379         itemdef.cpp
380         light.cpp
381         log.cpp
382         map.cpp
383         mapblock.cpp
384         mapgen.cpp
385         mapgen_flat.cpp
386         mapgen_fractal.cpp
387         mapgen_singlenode.cpp
388         mapgen_v5.cpp
389         mapgen_v6.cpp
390         mapgen_v7.cpp
391         mapgen_valleys.cpp
392         mapnode.cpp
393         mapsector.cpp
394         mg_biome.cpp
395         mg_decoration.cpp
396         mg_ore.cpp
397         mg_schematic.cpp
398         mods.cpp
399         nameidmapping.cpp
400         nodedef.cpp
401         nodemetadata.cpp
402         nodetimer.cpp
403         noise.cpp
404         objdef.cpp
405         object_properties.cpp
406         pathfinder.cpp
407         player.cpp
408         porting.cpp
409         profiler.cpp
410         quicktune.cpp
411         rollback.cpp
412         rollback_interface.cpp
413         serialization.cpp
414         server.cpp
415         serverlist.cpp
416         serverobject.cpp
417         settings.cpp
418         socket.cpp
419         sound.cpp
420         staticobject.cpp
421         subgame.cpp
422         terminal_chat_console.cpp
423         tool.cpp
424         treegen.cpp
425         version.cpp
426         voxel.cpp
427         voxelalgorithms.cpp
428         ${common_network_SRCS}
429         ${JTHREAD_SRCS}
430         ${common_SCRIPT_SRCS}
431         ${UTIL_SRCS}
432         ${UNITTEST_SRCS}
433 )
434
435
436 # This gives us the icon and file version information
437 if(WIN32)
438         set(WINRESOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc")
439         if(MINGW)
440                 if(NOT CMAKE_RC_COMPILER)
441                         set(CMAKE_RC_COMPILER "windres.exe")
442                 endif()
443                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
444                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
445                         -i${WINRESOURCE_FILE}
446                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
447                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
448                         DEPENDS ${WINRESOURCE_FILE})
449                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
450         else(MINGW) # Probably MSVC
451                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
452         endif(MINGW)
453 endif()
454
455
456 # Client sources
457 if (BUILD_CLIENT)
458         add_subdirectory(client)
459 endif(BUILD_CLIENT)
460
461 set(client_SRCS
462         ${client_SRCS}
463         ${common_SRCS}
464         ${sound_SRCS}
465         ${client_network_SRCS}
466         camera.cpp
467         client.cpp
468         clientmap.cpp
469         clientmedia.cpp
470         clientobject.cpp
471         clouds.cpp
472         content_cao.cpp
473         content_cso.cpp
474         content_mapblock.cpp
475         convert_json.cpp
476         drawscene.cpp
477         filecache.cpp
478         fontengine.cpp
479         game.cpp
480         guiChatConsole.cpp
481         guiEngine.cpp
482         guiFileSelectMenu.cpp
483         guiFormSpecMenu.cpp
484         guiKeyChangeMenu.cpp
485         guiPasswordChange.cpp
486         guiscalingfilter.cpp
487         guiTable.cpp
488         guiVolumeChange.cpp
489         hud.cpp
490         imagefilters.cpp
491         intlGUIEditBox.cpp
492         keycode.cpp
493         localplayer.cpp
494         main.cpp
495         mapblock_mesh.cpp
496         mesh.cpp
497         minimap.cpp
498         particles.cpp
499         shader.cpp
500         sky.cpp
501         wieldmesh.cpp
502         ${client_SCRIPT_SRCS}
503 )
504 list(SORT client_SRCS)
505
506 # Server sources
507 set(server_SRCS
508         ${common_SRCS}
509         main.cpp
510 )
511 list(SORT server_SRCS)
512
513 include_directories(
514         ${PROJECT_BINARY_DIR}
515         ${PROJECT_SOURCE_DIR}
516         ${IRRLICHT_INCLUDE_DIR}
517         ${ZLIB_INCLUDE_DIR}
518         ${CMAKE_BUILD_TYPE}
519         ${PNG_INCLUDE_DIR}
520         ${GETTEXT_INCLUDE_DIR}
521         ${SOUND_INCLUDE_DIRS}
522         ${SQLITE3_INCLUDE_DIR}
523         ${LUA_INCLUDE_DIR}
524         ${GMP_INCLUDE_DIR}
525         ${JSON_INCLUDE_DIR}
526         ${PROJECT_SOURCE_DIR}/script
527 )
528
529
530 if(USE_FREETYPE)
531         include_directories(${FREETYPE_INCLUDE_DIRS} ${CGUITTFONT_INCLUDE_DIR})
532 endif()
533
534 if(USE_CURL)
535         include_directories(${CURL_INCLUDE_DIR})
536 endif()
537
538
539 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
540
541
542 if(BUILD_CLIENT)
543         add_executable(${PROJECT_NAME} ${client_SRCS})
544         add_dependencies(${PROJECT_NAME} GenerateVersion)
545         set(client_LIBS
546                 ${PROJECT_NAME}
547                 ${ZLIB_LIBRARIES}
548                 ${IRRLICHT_LIBRARY}
549                 ${OPENGL_LIBRARIES}
550                 ${JPEG_LIBRARIES}
551                 ${BZIP2_LIBRARIES}
552                 ${PNG_LIBRARIES}
553                 ${X11_LIBRARIES}
554                 ${GETTEXT_LIBRARY}
555                 ${SOUND_LIBRARIES}
556                 ${SQLITE3_LIBRARY}
557                 ${LUA_LIBRARY}
558                 ${GMP_LIBRARY}
559                 ${JSON_LIBRARY}
560                 ${OPENGLES2_LIBRARIES}
561                 ${PLATFORM_LIBS}
562                 ${CLIENT_PLATFORM_LIBS}
563         )
564         if(APPLE)
565                 target_link_libraries(
566                         ${client_LIBS}
567                         ${ICONV_LIBRARY}
568                 )
569         else()
570                 target_link_libraries(
571                         ${client_LIBS}
572                 )
573         endif()
574         if(USE_CURL)
575                 target_link_libraries(
576                         ${PROJECT_NAME}
577                         ${CURL_LIBRARY}
578                 )
579         endif()
580         if(USE_FREETYPE)
581                 if(FREETYPE_PKGCONFIG_FOUND)
582                         set_target_properties(${PROJECT_NAME}
583                                 PROPERTIES
584                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
585                         )
586                 endif()
587                 target_link_libraries(
588                         ${PROJECT_NAME}
589                         ${FREETYPE_LIBRARY}
590                         ${CGUITTFONT_LIBRARY}
591                 )
592         endif()
593         if (USE_CURSES)
594                 target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES})
595         endif()
596         if (USE_LEVELDB)
597                 target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
598         endif()
599         if (USE_REDIS)
600                 target_link_libraries(${PROJECT_NAME} ${REDIS_LIBRARY})
601         endif()
602         if (USE_SPATIAL)
603                 target_link_libraries(${PROJECT_NAME} ${SPATIAL_LIBRARY})
604         endif()
605 endif(BUILD_CLIENT)
606
607
608 if(BUILD_SERVER)
609         add_executable(${PROJECT_NAME}server ${server_SRCS})
610         add_dependencies(${PROJECT_NAME}server GenerateVersion)
611         target_link_libraries(
612                 ${PROJECT_NAME}server
613                 ${ZLIB_LIBRARIES}
614                 ${SQLITE3_LIBRARY}
615                 ${JSON_LIBRARY}
616                 ${GETTEXT_LIBRARY}
617                 ${LUA_LIBRARY}
618                 ${GMP_LIBRARY}
619                 ${PLATFORM_LIBS}
620         )
621         set_target_properties(${PROJECT_NAME}server PROPERTIES
622                         COMPILE_DEFINITIONS "SERVER")
623         if (USE_CURSES)
624                 target_link_libraries(${PROJECT_NAME}server ${CURSES_LIBRARIES})
625         endif()
626         if (USE_LEVELDB)
627                 target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
628         endif()
629         if (USE_REDIS)
630                 target_link_libraries(${PROJECT_NAME}server ${REDIS_LIBRARY})
631         endif()
632         if (USE_SPATIAL)
633                 target_link_libraries(${PROJECT_NAME}server ${SPATIAL_LIBRARY})
634         endif()
635         if(USE_CURL)
636                 target_link_libraries(
637                         ${PROJECT_NAME}server
638                         ${CURL_LIBRARY}
639                 )
640         endif()
641 endif(BUILD_SERVER)
642
643
644 # Set some optimizations and tweaks
645
646 include(CheckCXXCompilerFlag)
647
648 if(MSVC)
649         # Visual Studio
650
651         # EHa enables SEH exceptions (used for catching segfaults)
652         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")
653         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
654         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
655
656         set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
657
658         # Debug build doesn't catch exceptions by itself
659         # Add some optimizations because otherwise it's VERY slow
660         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
661
662         # Flags for C files (sqlite)
663         # /MT = Link statically with standard library stuff
664         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
665 else()
666         # Probably GCC
667         if(APPLE)
668                 SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
669         endif()
670         if(WARN_ALL)
671                 set(RELEASE_WARNING_FLAGS "-Wall")
672         else()
673                 set(RELEASE_WARNING_FLAGS "")
674         endif()
675
676         if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
677                 # clang does not understand __extern_always_inline but libc headers use it
678                 set(OTHER_FLAGS "${OTHER_FLAGS} \"-D__extern_always_inline=extern __always_inline\"")
679                 set(OTHER_FLAGS "${OTHER_FLAGS} -Wsign-compare")
680         endif()
681
682         if(MINGW)
683                 set(OTHER_FLAGS "-mthreads -fexceptions")
684         endif()
685
686         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops")
687         if(APPLE)
688                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
689         else()
690                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -fomit-frame-pointer")
691         endif(APPLE)
692         set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
693         set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wabi ${WARNING_FLAGS} ${OTHER_FLAGS}")
694
695         if(USE_GPROF)
696                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
697         endif()
698 endif()
699
700
701 # Installation
702
703 if(WIN32)
704         if(USE_SOUND)
705                 if(OPENAL_DLL)
706                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
707                 endif()
708                 if(OGG_DLL)
709                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
710                 endif()
711                 if(VORBIS_DLL)
712                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
713                 endif()
714                 if(VORBISFILE_DLL)
715                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
716                 endif()
717         endif()
718         if(CURL_DLL)
719                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
720         endif()
721         if(ZLIB_DLL)
722                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
723         endif()
724         if(ZLIBWAPI_DLL)
725                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
726         endif()
727         if(FREETYPE_DLL)
728                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
729         endif()
730         if(SQLITE3_DLL)
731                 install(FILES ${SQLITE3_DLL} DESTINATION ${BINDIR})
732         endif()
733         if(LEVELDB_DLL)
734                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
735         endif()
736 endif()
737
738 if(BUILD_CLIENT)
739         install(TARGETS ${PROJECT_NAME}
740                 RUNTIME DESTINATION ${BINDIR}
741                 LIBRARY DESTINATION ${BINDIR}
742                 ARCHIVE DESTINATION ${BINDIR}
743                 BUNDLE DESTINATION .
744         )
745
746         if(APPLE)
747                 install(CODE "
748                         set(BU_CHMOD_BUNDLE_ITEMS ON)
749                         include(BundleUtilities)
750                         fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/${BUNDLE_PATH}\" \"\" \"\${CMAKE_INSTALL_PREFIX}/${BINDIR}\")
751                 " COMPONENT Runtime)
752         endif()
753
754         if(USE_GETTEXT)
755                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
756                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
757                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
758                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
759                 endforeach()
760         endif()
761
762         if(WIN32)
763                 if(DEFINED IRRLICHT_DLL)
764                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
765                 endif()
766                 if(USE_GETTEXT)
767                         if(DEFINED GETTEXT_DLL)
768                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
769                         endif()
770                         if(DEFINED GETTEXT_ICONV_DLL)
771                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
772                         endif()
773                 endif()
774         endif()
775 endif(BUILD_CLIENT)
776
777 if(BUILD_SERVER)
778         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
779 endif()
780
781 if (USE_GETTEXT)
782         set(MO_FILES)
783
784         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
785                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME}.po")
786                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
787                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
788
789                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
790                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
791                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
792
793                 add_custom_command(
794                         OUTPUT ${MO_FILE_PATH}
795                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
796                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
797                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
798                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
799                         )
800
801                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
802         endforeach()
803
804         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
805 endif()
806
807
808 # Subdirectories
809
810 if (BUILD_CLIENT AND USE_FREETYPE)
811         add_subdirectory(cguittfont)
812 endif()
813