]> git.lizzy.rs Git - dragonfireclient.git/blob - src/CMakeLists.txt
Use binary operators rather than "Python modulo" in decoding block positions
[dragonfireclient.git] / src / CMakeLists.txt
1 project(minetest)
2 cmake_minimum_required( VERSION 2.6 )
3
4 INCLUDE(CheckCSourceRuns)
5
6 # Set some random things default to not being visible in the GUI
7 mark_as_advanced(EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH)
8 mark_as_advanced(SQLITE3_INCLUDE_DIR SQLITE3_LIBRARY)
9 mark_as_advanced(JSON_INCLUDE_DIR JSON_LIBRARY)
10
11 option(ENABLE_CURL "Enable cURL support for fetching media" 1)
12
13 if (NOT ENABLE_CURL)
14         mark_as_advanced(CLEAR CURL_LIBRARY CURL_INCLUDE_DIR)
15 endif(NOT ENABLE_CURL)
16
17 if( ENABLE_CURL )
18         find_package(CURL)
19 endif( ENABLE_CURL )
20 set(USE_CURL 0)
21 if (CURL_FOUND AND ENABLE_CURL)
22         message(STATUS "cURL support enabled")
23         set(USE_CURL 1)
24 endif(CURL_FOUND AND ENABLE_CURL)
25
26 # user-visible option to enable/disable gettext usage
27 OPTION(ENABLE_GETTEXT "Use GetText for internationalization" 0)
28
29 # this is only set to 1 if gettext is enabled _and_ available
30 set(USE_GETTEXT 0)
31
32 if(ENABLE_GETTEXT)
33         find_package(GettextLib)
34 else()
35         MARK_AS_ADVANCED(GETTEXT_ICONV_DLL GETTEXT_INCLUDE_DIR GETTEXT_LIBRARY GETTEXT_MSGFMT)
36 endif()
37
38 if(GETTEXT_FOUND AND ENABLE_GETTEXT)
39         message(STATUS "gettext include path: ${GETTEXT_INCLUDE_DIR}")
40         message(STATUS "gettext msgfmt path: ${GETTEXT_MSGFMT}")
41         if(WIN32)
42                 message(STATUS "gettext library: ${GETTEXT_LIBRARY}")
43                 message(STATUS "gettext dll: ${GETTEXT_DLL}")
44                 message(STATUS "gettext iconv dll: ${GETTEXT_ICONV_DLL}")
45         endif()
46         set(USE_GETTEXT 1)
47         message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
48 elseif(GETTEXT_FOUND AND NOT ENABLE_GETTEXT)
49         MESSAGE(STATUS "GetText found but disabled;")
50 else(GETTEXT_FOUND AND ENABLE_GETTEXT)
51         message(STATUS "GetText disabled")
52 endif(GETTEXT_FOUND AND ENABLE_GETTEXT)
53
54 # user visible option to enable/disable sound
55 OPTION(ENABLE_SOUND "Enable sound" ON)
56
57 # this is only set to 1 if sound is enabled _and_ available
58 set(USE_SOUND 0)
59 set(SOUND_PROBLEM 0)
60
61 if(ENABLE_SOUND AND BUILD_CLIENT)
62         # Sound libraries
63         find_package(OpenAL)
64         find_package(Vorbis)
65         if(NOT OPENAL_FOUND)
66                 message(STATUS "Sound enabled, but OpenAL not found!")
67                 set(SOUND_PROBLEM 1)
68                 MARK_AS_ADVANCED(CLEAR OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
69         endif()
70         if(NOT VORBIS_FOUND)
71                 message(STATUS "Sound enabled, but Vorbis libraries not found!")
72                 set(SOUND_PROBLEM 1)
73                 MARK_AS_ADVANCED(CLEAR OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)
74         endif()
75         if(OPENAL_FOUND AND VORBIS_FOUND)
76                 set(USE_SOUND 1)
77                 message(STATUS "Sound enabled")
78         endif()
79 endif(ENABLE_SOUND AND BUILD_CLIENT)
80
81 if(SOUND_PROBLEM)
82         message(FATAL_ERROR "Sound enabled, but cannot be used.\n"
83                 "To continue, either fill in the required paths or disable sound. (-DENABLE_SOUND=0)")
84 endif()
85 if(USE_SOUND)
86         set(sound_SRCS sound_openal.cpp)
87         set(SOUND_INCLUDE_DIRS
88                 ${OPENAL_INCLUDE_DIR}
89                 ${VORBIS_INCLUDE_DIR}
90                 ${OGG_INCLUDE_DIR}
91                 )
92         set(SOUND_LIBRARIES
93                 ${OPENAL_LIBRARY}
94                 ${VORBIS_LIBRARIES}
95                 )
96 endif()
97
98 option(ENABLE_FREETYPE "Enable freetype2 (truetype fonts and basic unicode support)" OFF)
99 set(USE_FREETYPE 0)
100 if(ENABLE_FREETYPE)
101         set(USE_FREETYPE 1)
102 endif(ENABLE_FREETYPE)
103
104 if(NOT MSVC)
105         set(USE_GPROF 0 CACHE BOOL "Use -pg flag for g++")
106 endif()
107
108 # Use cmake_config.h
109 add_definitions ( -DUSE_CMAKE_CONFIG_H )
110
111 if(WIN32)
112         # Windows
113         if(MSVC) # MSVC Specifics
114                 # Surpress some useless warnings
115                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
116         else() # Probably MinGW = GCC
117                 set(PLATFORM_LIBS ws2_32.lib)
118         endif()
119         # Zlib stuff
120         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
121                         CACHE PATH "Zlib include directory")
122         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
123                         CACHE FILEPATH "Path to zlibwapi.lib")
124         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
125                         CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
126         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
127                         CACHE PATH "irrlicht dir")
128         if(USE_FREETYPE)
129                 set(FREETYPE_INCLUDE_DIR_ft2build "${PROJECT_SOURCE_DIR}/../../freetype2/include/"
130                                 CACHE PATH "freetype include dir")
131                 set(FREETYPE_INCLUDE_DIR_freetype2 "${PROJECT_SOURCE_DIR}/../../freetype2/include/freetype"
132                                 CACHE PATH "freetype include dir")
133                 set(FREETYPE_LIBRARY "${PROJECT_SOURCE_DIR}/../../freetype2/objs/win32/vc2005/freetype247.lib"
134                                 CACHE FILEPATH "Path to freetype247.lib")
135         endif(USE_FREETYPE)
136         set(MINGWM10_DLL ""
137                         CACHE FILEPATH "Path to mingwm10.dll (for installation)")
138         if(ENABLE_SOUND)
139                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
140                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
141                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
142                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
143         endif()
144 else()
145         # Unix probably
146         if(BUILD_CLIENT)
147                 find_package(X11 REQUIRED)
148                 find_package(OpenGL REQUIRED)
149                 find_package(JPEG REQUIRED)
150                 find_package(BZip2 REQUIRED)
151                 find_package(PNG REQUIRED)
152                 if(APPLE)
153                         FIND_LIBRARY(CARBON_LIB Carbon)
154                         FIND_LIBRARY(COCOA_LIB Cocoa)
155                         FIND_LIBRARY(IOKIT_LIB IOKit)
156                         mark_as_advanced(
157                                 CARBON_LIB
158                                 COCOA_LIB
159                                 IOKIT_LIB
160                         )
161                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
162                 endif(APPLE)
163         endif(BUILD_CLIENT)
164         find_package(ZLIB REQUIRED)
165         set(PLATFORM_LIBS -lpthread -lrt ${CMAKE_DL_LIBS})
166         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
167         # This way Xxf86vm is found on OpenBSD too
168         find_library(XXF86VM_LIBRARY Xxf86vm)
169         mark_as_advanced(XXF86VM_LIBRARY)
170         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
171 endif()
172
173 find_package(Sqlite3 REQUIRED)
174 find_package(Json REQUIRED)
175
176 option(ENABLE_GLES "Enable OpenGL ES support" 0)
177 mark_as_advanced(ENABLE_GLES)
178 if(ENABLE_GLES)
179         find_package(OpenGLES2)
180 endif(ENABLE_GLES)
181
182 if(USE_FREETYPE)
183         if(UNIX)
184                 include(FindPkgConfig)
185                 if(PKG_CONFIG_FOUND)
186                         pkg_check_modules(FREETYPE QUIET freetype2)
187                         if(FREETYPE_FOUND)
188                                 SET(FREETYPE_PKGCONFIG_FOUND TRUE)
189                                 SET(FREETYPE_LIBRARY ${FREETYPE_LIBRARIES})
190                                 # because cmake is idiotic
191                                 string(REPLACE ";" " " FREETYPE_CFLAGS_STR ${FREETYPE_CFLAGS})
192                                 string(REPLACE ";" " " FREETYPE_LDFLAGS_STR ${FREETYPE_LDFLAGS})
193                         endif(FREETYPE_FOUND)
194                 endif(PKG_CONFIG_FOUND)
195         endif(UNIX)
196         if(NOT FREETYPE_FOUND)
197                 find_package(Freetype REQUIRED)
198         endif(NOT FREETYPE_FOUND)
199         set(CGUITTFONT_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cguittfont")
200         set(CGUITTFONT_LIBRARY cguittfont)
201 endif(USE_FREETYPE)
202
203 if (NOT DISABLE_LUAJIT)
204         find_library(LUA_LIBRARY luajit
205                         NAMES luajit-5.1)
206         find_path(LUA_INCLUDE_DIR luajit.h
207                 NAMES luajit.h
208                 PATH_SUFFIXES luajit-2.0)
209         message (STATUS "LuaJIT library: ${LUA_LIBRARY}")
210         message (STATUS "LuaJIT headers: ${LUA_INCLUDE_DIR}")
211 else (NOT ${DISABLE_LUAJIT} MATCHES "1")
212         message (STATUS "LuaJIT detection disabled! (DISABLE_LUAJIT=1)")
213         set(LUA_LIBRARY "")
214         set(LUA_INCLUDE_DIR "")
215 endif (NOT DISABLE_LUAJIT)
216
217 set(USE_LUAJIT 0)
218 if(LUA_LIBRARY AND LUA_INCLUDE_DIR)
219         message (STATUS "LuaJIT found, checking for broken versions...")
220         if(CMAKE_CROSSCOMPILING)
221                 message(WARNING "Cross-compiling enabled, assuming LuaJIT is not broken")
222                 set(VALID_LUAJIT_VERSION 1)
223         else(CMAKE_CROSSCOMPILING)
224                 set(BACKUP_REQUIRED_INCS CMAKE_REQUIRED_INCLUDES)
225                 set(CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES} ${LUA_INCLUDE_DIR}")
226                 CHECK_C_SOURCE_RUNS("
227                         #include <luajit.h>
228                         #include <stdio.h>
229                         #include <string.h>
230
231                         #define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
232
233                         static char *broken_luajit_versions[] = {
234                                         \"LuaJIT 2.0.0-beta7\",
235                                         \"LuaJIT 2.0.0-beta6\",
236                                         \"LuaJIT 2.0.0-beta5\",
237                                         \"LuaJIT 2.0.0-beta4\",
238                                         \"LuaJIT 2.0.0-beta3\",
239                                         \"LuaJIT 2.0.0-beta2\",
240                                         \"LuaJIT 2.0.0-beta1\"
241                         };
242
243                         int main(int argc, char *argv[]) {
244                                 unsigned int i;
245                                 for (i = 0; i < ARRAYSIZE(broken_luajit_versions); i++) {
246                                         if (strcmp(LUAJIT_VERSION, broken_luajit_versions[i]) == 0) {
247                                                 return 1;
248                                         }
249                                 }
250                                 return 0;
251                         }
252                         "
253                         VALID_LUAJIT_VERSION)
254                 set(CMAKE_REQUIRED_INCLUDES BACKUP_REQUIRED_INCS)
255         endif(CMAKE_CROSSCOMPILING)
256         if (VALID_LUAJIT_VERSION)
257                 message (STATUS "LuaJIT version ok")
258                 set(USE_LUAJIT 1)
259         else (VALID_LUAJIT_VERSION)
260                 message (STATUS "LuaJIT versions till 2.0.0beta7 known to be broken, update to at least beta8")
261                 set(USE_LUAJIT 0)
262         endif (VALID_LUAJIT_VERSION)
263 endif (LUA_LIBRARY AND LUA_INCLUDE_DIR)
264
265 if(NOT USE_LUAJIT)
266         message (STATUS "LuaJIT not found, using bundled Lua.")
267         set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
268         set(LUA_LIBRARY "lua")
269         add_subdirectory(lua)
270 endif(NOT USE_LUAJIT)
271
272 mark_as_advanced(LUA_LIBRARY)
273 mark_as_advanced(LUA_INCLUDE_DIR)
274
275 set(USE_LEVELDB 0)
276
277 OPTION(ENABLE_LEVELDB "Enable LevelDB backend")
278
279 if(ENABLE_LEVELDB)
280         find_library(LEVELDB_LIBRARY leveldb)
281         find_path(LEVELDB_INCLUDE_DIR db.h PATH_SUFFIXES leveldb)
282         message (STATUS "LevelDB library: ${LEVELDB_LIBRARY}")
283         message (STATUS "LevelDB headers: ${LEVELDB_INCLUDE_DIR}")
284         if(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
285                 set(USE_LEVELDB 1)
286                 message(STATUS "LevelDB backend enabled")
287                 include_directories(${LEVELDB_INCLUDE_DIR})
288         else(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
289                 set(USE_LEVELDB 0)
290                 message(STATUS "LevelDB not found!")
291         endif(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
292 endif(ENABLE_LEVELDB)
293
294 configure_file(
295         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
296         "${PROJECT_BINARY_DIR}/cmake_config.h"
297 )
298
299 # Add a target that always rebuilds cmake_config_githash.h
300 add_custom_target(GenerateVersion
301         COMMAND ${CMAKE_COMMAND}
302         -D "GENERATE_VERSION_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
303         -D "GENERATE_VERSION_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
304         -D "VERSION_STRING=${VERSION_STRING}"
305         -D "VERSION_EXTRA=${VERSION_EXTRA}"
306         -P "${CMAKE_SOURCE_DIR}/cmake/Modules/GenerateVersion.cmake"
307         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
308
309 add_subdirectory(jthread)
310 add_subdirectory(script)
311 add_subdirectory(util)
312
313 set(common_SRCS
314         version.cpp
315         rollback_interface.cpp
316         rollback.cpp
317         genericobject.cpp
318         voxelalgorithms.cpp
319         sound.cpp
320         quicktune.cpp
321         subgame.cpp
322         inventorymanager.cpp
323         mods.cpp
324         content_abm.cpp
325         craftdef.cpp
326         nameidmapping.cpp
327         itemdef.cpp
328         nodedef.cpp
329         object_properties.cpp
330         log.cpp
331         content_sao.cpp
332         emerge.cpp
333         mapgen.cpp
334         mapgen_v6.cpp
335         mapgen_v7.cpp
336         mapgen_indev.cpp
337         mapgen_singlenode.cpp
338         mapgen_math.cpp
339         treegen.cpp
340         dungeongen.cpp
341         cavegen.cpp
342         content_nodemeta.cpp
343         content_mapnode.cpp
344         collision.cpp
345         nodemetadata.cpp
346         nodetimer.cpp
347         serverobject.cpp
348         noise.cpp
349         porting.cpp
350         tool.cpp
351         defaultsettings.cpp
352         mapnode.cpp
353         voxel.cpp
354         inventory.cpp
355         debug.cpp
356         serialization.cpp
357         light.cpp
358         filesys.cpp
359         connection.cpp
360         environment.cpp
361         server.cpp
362         clientiface.cpp
363         socket.cpp
364         mapblock.cpp
365         mapsector.cpp
366         map.cpp
367         database.cpp
368         database-dummy.cpp
369         database-leveldb.cpp
370         database-sqlite3.cpp
371         player.cpp
372         test.cpp
373         sha1.cpp
374         base64.cpp
375         ban.cpp
376         biome.cpp
377         staticobject.cpp
378         serverlist.cpp
379         pathfinder.cpp
380         convert_json.cpp
381         gettext.cpp
382         httpfetch.cpp
383         ${JTHREAD_SRCS}
384         ${common_SCRIPT_SRCS}
385         ${UTIL_SRCS}
386 )
387
388 # This gives us the icon and file version information
389 if(WIN32)
390         set(WINRESOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc)
391         if(MINGW)
392                 if(NOT CMAKE_RC_COMPILER)
393                         set(CMAKE_RC_COMPILER "windres.exe")
394                 endif()
395                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
396                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
397                         -i${WINRESOURCE_FILE}
398                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
399                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
400                         DEPENDS ${WINRESOURCE_FILE})
401                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
402         else(MINGW) # Probably MSVC
403                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
404         endif(MINGW)
405 endif()
406
407 # Client sources
408 set(minetest_SRCS
409         ${common_SRCS}
410         ${sound_SRCS}
411         localplayer.cpp
412         sky.cpp
413         clientmap.cpp
414         content_cso.cpp
415         content_mapblock.cpp
416         content_cao.cpp
417         mesh.cpp
418         mapblock_mesh.cpp
419         keycode.cpp
420         camera.cpp
421         clouds.cpp
422         particles.cpp
423         clientobject.cpp
424         chat.cpp
425         hud.cpp
426         guiKeyChangeMenu.cpp
427         guiTextInputMenu.cpp
428         guiFormSpecMenu.cpp
429         guiTable.cpp
430         guiPasswordChange.cpp
431         guiVolumeChange.cpp
432         guiDeathScreen.cpp
433         guiChatConsole.cpp
434         client.cpp
435         clientmedia.cpp
436         filecache.cpp
437         tile.cpp
438         shader.cpp
439         game.cpp
440         main.cpp
441         guiEngine.cpp
442         guiFileSelectMenu.cpp
443         convert_json.cpp
444         ${minetest_SCRIPT_SRCS}
445 )
446
447 if(USE_FREETYPE)
448         set(minetest_SRCS
449                 ${minetest_SRCS}
450                 intlGUIEditBox.cpp
451         )
452 endif(USE_FREETYPE)
453
454 list(SORT minetest_SRCS)
455
456 # Server sources
457 set(minetestserver_SRCS
458         ${common_SRCS}
459         main.cpp
460 )
461 list(SORT minetestserver_SRCS)
462
463 include_directories(
464         ${PROJECT_BINARY_DIR}
465         ${PROJECT_SOURCE_DIR}
466         ${IRRLICHT_INCLUDE_DIR}
467         ${ZLIB_INCLUDE_DIR}
468         ${CMAKE_BUILD_TYPE}
469         ${PNG_INCLUDE_DIR}
470         ${GETTEXT_INCLUDE_DIR}
471         ${SOUND_INCLUDE_DIRS}
472         ${SQLITE3_INCLUDE_DIR}
473         ${LUA_INCLUDE_DIR}
474         ${JSON_INCLUDE_DIR}
475         ${PROJECT_SOURCE_DIR}/script
476 )
477
478 if(USE_FREETYPE)
479         include_directories(
480                 ${FREETYPE_INCLUDE_DIRS}
481                 ${CGUITTFONT_INCLUDE_DIR}
482         )
483 endif(USE_FREETYPE)
484
485 if(USE_CURL)
486         include_directories(
487                 ${CURL_INCLUDE_DIR}
488         )
489 endif(USE_CURL)
490
491 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
492
493 if(BUILD_CLIENT)
494         add_executable(${PROJECT_NAME} ${minetest_SRCS})
495         add_dependencies(${PROJECT_NAME} GenerateVersion)
496         target_link_libraries(
497                 ${PROJECT_NAME}
498                 ${ZLIB_LIBRARIES}
499                 ${IRRLICHT_LIBRARY}
500                 ${OPENGL_LIBRARIES}
501                 ${JPEG_LIBRARIES}
502                 ${BZIP2_LIBRARIES}
503                 ${PNG_LIBRARIES}
504                 ${X11_LIBRARIES}
505                 ${GETTEXT_LIBRARY}
506                 ${SOUND_LIBRARIES}
507                 ${SQLITE3_LIBRARY}
508                 ${LUA_LIBRARY}
509                 ${JSON_LIBRARY}
510                 ${OPENGLES2_LIBRARIES}
511                 ${PLATFORM_LIBS}
512                 ${CLIENT_PLATFORM_LIBS}
513         )
514         if(USE_CURL)
515                 target_link_libraries(
516                         ${PROJECT_NAME}
517                         ${CURL_LIBRARY}
518                 )
519         endif(USE_CURL)
520         if(USE_FREETYPE)
521                 if(FREETYPE_PKGCONFIG_FOUND)
522                         set_target_properties(${PROJECT_NAME}
523                                 PROPERTIES
524                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
525                         )
526                 endif(FREETYPE_PKGCONFIG_FOUND)
527                 target_link_libraries(
528                         ${PROJECT_NAME}
529                         ${FREETYPE_LIBRARY}
530                         ${CGUITTFONT_LIBRARY}
531                 )
532         endif(USE_FREETYPE)
533         if (USE_LEVELDB)
534                 target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
535         endif(USE_LEVELDB)
536 endif(BUILD_CLIENT)
537
538 if(BUILD_SERVER)
539         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
540         add_dependencies(${PROJECT_NAME}server GenerateVersion)
541         target_link_libraries(
542                 ${PROJECT_NAME}server
543                 ${ZLIB_LIBRARIES}
544                 ${SQLITE3_LIBRARY}
545                 ${JSON_LIBRARY}
546                 ${GETTEXT_LIBRARY}
547                 ${LUA_LIBRARY}
548                 ${PLATFORM_LIBS}
549         )
550         if (USE_LEVELDB)
551                 target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
552         endif(USE_LEVELDB)
553         if(USE_CURL)
554                 target_link_libraries(
555                         ${PROJECT_NAME}server
556                         ${CURL_LIBRARY}
557                 )
558         endif(USE_CURL)
559 endif(BUILD_SERVER)
560
561
562 #
563 # Set some optimizations and tweaks
564 #
565
566 include(CheckCXXCompilerFlag)
567
568 if(MSVC)
569         # Visual Studio
570
571         # EHa enables SEH exceptions (used for catching segfaults)
572         set(CMAKE_CXX_FLAGS_RELEASE "/EHa /O2 /Ob2 /Oi /Ot /Oy /GL /FD /MT /GS- /arch:SSE /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
573         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
574         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
575
576         # Debug build doesn't catch exceptions by itself
577         # Add some optimizations because otherwise it's VERY slow
578         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
579
580         # Flags for C files (sqlite)
581         # /MT = Link statically with standard library stuff
582         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
583
584         if(BUILD_SERVER)
585                 set_target_properties(${PROJECT_NAME}server PROPERTIES
586                                 COMPILE_DEFINITIONS "SERVER")
587         endif(BUILD_SERVER)
588
589 else()
590         # Probably GCC
591
592         if(WARN_ALL)
593                 set(RELEASE_WARNING_FLAGS "-Wall")
594         else()
595                 set(RELEASE_WARNING_FLAGS "")
596         endif()
597
598         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
599                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
600                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
601                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
602                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
603         endif()
604
605         if(MINGW)
606                 set(OTHER_FLAGS "-mthreads -fexceptions")
607         endif()
608
609         if(APPLE)
610                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
611                 set(ARCH i386)
612         endif()
613
614         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
615         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}")
616
617         if(USE_GPROF)
618                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
619         endif()
620
621         if(BUILD_SERVER)
622                 set_target_properties(${PROJECT_NAME}server PROPERTIES
623                                 COMPILE_DEFINITIONS "SERVER")
624         endif(BUILD_SERVER)
625
626 endif()
627
628 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
629 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
630
631 #
632 # Installation
633 #
634 if(WIN32)
635         if(MINGWM10_DLL)
636                 install(FILES ${MINGWM10_DLL} DESTINATION ${BINDIR})
637         endif()
638         if(DEFINED ZLIB_DLL)
639                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
640         endif()
641         if(USE_SOUND)
642                 if(OPENAL_DLL)
643                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
644                 endif()
645                 if(OGG_DLL)
646                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
647                 endif()
648                 if(VORBIS_DLL)
649                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
650                 endif()
651                 if(VORBISFILE_DLL)
652                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
653                 endif()
654         endif()
655         if(CURL_DLL)
656                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
657         endif()
658 endif()
659
660 if(BUILD_CLIENT)
661         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
662
663         if(USE_GETTEXT)
664                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
665                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
666                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
667                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
668                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
669         endif()
670
671         if(WIN32)
672                 if(DEFINED IRRLICHT_DLL)
673                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
674                 endif()
675                 if(USE_GETTEXT)
676                         if(DEFINED GETTEXT_DLL)
677                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
678                         endif()
679                         if(DEFINED GETTEXT_ICONV_DLL)
680                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
681                         endif()
682                 endif(USE_GETTEXT)
683         endif()
684 endif(BUILD_CLIENT)
685
686 if(BUILD_SERVER)
687         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
688 endif(BUILD_SERVER)
689
690 if (USE_GETTEXT)
691         set(MO_FILES)
692
693         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
694                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
695                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
696                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
697
698                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
699                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
700                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
701
702                 add_custom_command(
703                         OUTPUT ${MO_FILE_PATH}
704                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
705                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
706                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
707                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
708                         )
709
710                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
711         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
712
713         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
714 endif(USE_GETTEXT)
715
716 # Subdirectories
717
718 if (SQLITE3_FOUND)
719 else (SQLITE3_FOUND)
720         add_subdirectory(sqlite)
721 endif (SQLITE3_FOUND)
722
723 if (BUILD_CLIENT AND USE_FREETYPE)
724         add_subdirectory(cguittfont)
725 endif (BUILD_CLIENT AND USE_FREETYPE)
726
727 if (JSON_FOUND)
728 else (JSON_FOUND)
729         add_subdirectory(json)
730 endif (JSON_FOUND)
731
732 #end