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