]> git.lizzy.rs Git - dragonfireclient.git/blob - src/CMakeLists.txt
de1ea2c28eaf0e0936df1127f62649eae4b5cd3c
[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         if(ENABLE_SOUND)
137                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
138                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
139                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
140                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
141         endif()
142 else()
143         # Unix probably
144         if(BUILD_CLIENT)
145                 find_package(X11 REQUIRED)
146                 find_package(OpenGL REQUIRED)
147                 find_package(JPEG REQUIRED)
148                 find_package(BZip2 REQUIRED)
149                 find_package(PNG REQUIRED)
150                 if(APPLE)
151                         FIND_LIBRARY(CARBON_LIB Carbon)
152                         FIND_LIBRARY(COCOA_LIB Cocoa)
153                         FIND_LIBRARY(IOKIT_LIB IOKit)
154                         mark_as_advanced(
155                                 CARBON_LIB
156                                 COCOA_LIB
157                                 IOKIT_LIB
158                         )
159                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
160                 endif(APPLE)
161         endif(BUILD_CLIENT)
162         find_package(ZLIB REQUIRED)
163         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
164         if(APPLE)
165                 set(PLATFORM_LIBS "-framework CoreFoundation" ${PLATFORM_LIBS})
166         else()
167                 set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
168         endif(APPLE)
169         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
170         # This way Xxf86vm is found on OpenBSD too
171         find_library(XXF86VM_LIBRARY Xxf86vm)
172         mark_as_advanced(XXF86VM_LIBRARY)
173         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
174 endif()
175
176 find_package(Sqlite3 REQUIRED)
177 find_package(Json REQUIRED)
178
179 option(ENABLE_GLES "Enable OpenGL ES support" 0)
180 mark_as_advanced(ENABLE_GLES)
181 if(ENABLE_GLES)
182         find_package(OpenGLES2)
183 endif(ENABLE_GLES)
184
185 if(USE_FREETYPE)
186         if(UNIX)
187                 include(FindPkgConfig)
188                 if(PKG_CONFIG_FOUND)
189                         pkg_check_modules(FREETYPE QUIET freetype2)
190                         if(FREETYPE_FOUND)
191                                 SET(FREETYPE_PKGCONFIG_FOUND TRUE)
192                                 SET(FREETYPE_LIBRARY ${FREETYPE_LIBRARIES})
193                                 # because cmake is idiotic
194                                 string(REPLACE ";" " " FREETYPE_CFLAGS_STR ${FREETYPE_CFLAGS})
195                                 string(REPLACE ";" " " FREETYPE_LDFLAGS_STR ${FREETYPE_LDFLAGS})
196                         endif(FREETYPE_FOUND)
197                 endif(PKG_CONFIG_FOUND)
198         endif(UNIX)
199         if(NOT FREETYPE_FOUND)
200                 find_package(Freetype REQUIRED)
201         endif(NOT FREETYPE_FOUND)
202         set(CGUITTFONT_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cguittfont")
203         set(CGUITTFONT_LIBRARY cguittfont)
204 endif(USE_FREETYPE)
205
206 if (NOT DISABLE_LUAJIT)
207         find_library(LUA_LIBRARY luajit
208                         NAMES luajit-5.1)
209         find_path(LUA_INCLUDE_DIR luajit.h
210                 NAMES luajit.h
211                 PATH_SUFFIXES luajit-2.0)
212         message (STATUS "LuaJIT library: ${LUA_LIBRARY}")
213         message (STATUS "LuaJIT headers: ${LUA_INCLUDE_DIR}")
214 else (NOT ${DISABLE_LUAJIT} MATCHES "1")
215         message (STATUS "LuaJIT detection disabled! (DISABLE_LUAJIT=1)")
216         set(LUA_LIBRARY "")
217         set(LUA_INCLUDE_DIR "")
218 endif (NOT DISABLE_LUAJIT)
219
220 set(USE_LUAJIT 0)
221 if(LUA_LIBRARY AND LUA_INCLUDE_DIR)
222         message (STATUS "LuaJIT found, checking for broken versions...")
223         if(CMAKE_CROSSCOMPILING)
224                 message(WARNING "Cross-compiling enabled, assuming LuaJIT is not broken")
225                 set(VALID_LUAJIT_VERSION 1)
226         else(CMAKE_CROSSCOMPILING)
227                 set(BACKUP_REQUIRED_INCS CMAKE_REQUIRED_INCLUDES)
228                 set(CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES} ${LUA_INCLUDE_DIR}")
229                 CHECK_C_SOURCE_RUNS("
230                         #include <luajit.h>
231                         #include <stdio.h>
232                         #include <string.h>
233
234                         #define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
235
236                         static char *broken_luajit_versions[] = {
237                                         \"LuaJIT 2.0.0-beta7\",
238                                         \"LuaJIT 2.0.0-beta6\",
239                                         \"LuaJIT 2.0.0-beta5\",
240                                         \"LuaJIT 2.0.0-beta4\",
241                                         \"LuaJIT 2.0.0-beta3\",
242                                         \"LuaJIT 2.0.0-beta2\",
243                                         \"LuaJIT 2.0.0-beta1\"
244                         };
245
246                         int main(int argc, char *argv[]) {
247                                 unsigned int i;
248                                 for (i = 0; i < ARRAYSIZE(broken_luajit_versions); i++) {
249                                         if (strcmp(LUAJIT_VERSION, broken_luajit_versions[i]) == 0) {
250                                                 return 1;
251                                         }
252                                 }
253                                 return 0;
254                         }
255                         "
256                         VALID_LUAJIT_VERSION)
257                 set(CMAKE_REQUIRED_INCLUDES BACKUP_REQUIRED_INCS)
258         endif(CMAKE_CROSSCOMPILING)
259         if (VALID_LUAJIT_VERSION)
260                 message (STATUS "LuaJIT version ok")
261                 set(USE_LUAJIT 1)
262         else (VALID_LUAJIT_VERSION)
263                 message (STATUS "LuaJIT versions till 2.0.0beta7 known to be broken, update to at least beta8")
264                 set(USE_LUAJIT 0)
265         endif (VALID_LUAJIT_VERSION)
266 endif (LUA_LIBRARY AND LUA_INCLUDE_DIR)
267
268 if(NOT USE_LUAJIT)
269         message (STATUS "LuaJIT not found, using bundled Lua.")
270         set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
271         set(LUA_LIBRARY "lua")
272         add_subdirectory(lua)
273 endif(NOT USE_LUAJIT)
274
275 mark_as_advanced(LUA_LIBRARY)
276 mark_as_advanced(LUA_INCLUDE_DIR)
277
278 set(USE_LEVELDB 0)
279
280 OPTION(ENABLE_LEVELDB "Enable LevelDB backend")
281
282 if(ENABLE_LEVELDB)
283         find_library(LEVELDB_LIBRARY leveldb)
284         find_path(LEVELDB_INCLUDE_DIR db.h PATH_SUFFIXES leveldb)
285         message (STATUS "LevelDB library: ${LEVELDB_LIBRARY}")
286         message (STATUS "LevelDB headers: ${LEVELDB_INCLUDE_DIR}")
287         if(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
288                 set(USE_LEVELDB 1)
289                 message(STATUS "LevelDB backend enabled")
290                 include_directories(${LEVELDB_INCLUDE_DIR})
291         else(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
292                 set(USE_LEVELDB 0)
293                 message(STATUS "LevelDB not found!")
294         endif(LEVELDB_LIBRARY AND LEVELDB_INCLUDE_DIR)
295 endif(ENABLE_LEVELDB)
296
297 set(USE_REDIS 0)
298
299 OPTION(ENABLE_REDIS "Enable redis backend" 1)
300
301 if(ENABLE_REDIS)
302         find_library(REDIS_LIBRARY hiredis)
303         find_path(REDIS_INCLUDE_DIR hiredis.h PATH_SUFFIXES hiredis)
304         message(STATUS "redis library: ${REDIS_LIBRARY}")
305         message(STATUS "redis headers: ${REDIS_INCLUDE_DIR}")
306         if(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
307                 set(USE_REDIS 1)
308                 message(STATUS "redis backend enabled")
309                 include_directories(${REDIS_INCLUDE_DIR})
310         else(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
311                 set(USE_REDIS 0)
312                 message(STATUS "redis not found!")
313         endif(REDIS_LIBRARY AND REDIS_INCLUDE_DIR)
314 endif(ENABLE_REDIS)
315
316 configure_file(
317         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
318         "${PROJECT_BINARY_DIR}/cmake_config.h"
319 )
320
321 # Add a target that always rebuilds cmake_config_githash.h
322 add_custom_target(GenerateVersion
323         COMMAND ${CMAKE_COMMAND}
324         -D "GENERATE_VERSION_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
325         -D "GENERATE_VERSION_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
326         -D "VERSION_STRING=${VERSION_STRING}"
327         -D "VERSION_EXTRA=${VERSION_EXTRA}"
328         -P "${CMAKE_SOURCE_DIR}/cmake/Modules/GenerateVersion.cmake"
329         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
330
331 add_subdirectory(jthread)
332 add_subdirectory(script)
333 add_subdirectory(util)
334
335 set(common_SRCS
336         version.cpp
337         rollback_interface.cpp
338         rollback.cpp
339         genericobject.cpp
340         voxelalgorithms.cpp
341         sound.cpp
342         quicktune.cpp
343         subgame.cpp
344         inventorymanager.cpp
345         mods.cpp
346         content_abm.cpp
347         craftdef.cpp
348         nameidmapping.cpp
349         itemdef.cpp
350         nodedef.cpp
351         object_properties.cpp
352         log.cpp
353         content_sao.cpp
354         emerge.cpp
355         mapgen.cpp
356         mapgen_v6.cpp
357         mapgen_v7.cpp
358         mapgen_singlenode.cpp
359         treegen.cpp
360         dungeongen.cpp
361         cavegen.cpp
362         content_nodemeta.cpp
363         content_mapnode.cpp
364         collision.cpp
365         nodemetadata.cpp
366         nodetimer.cpp
367         serverobject.cpp
368         noise.cpp
369         porting.cpp
370         tool.cpp
371         defaultsettings.cpp
372         mapnode.cpp
373         voxel.cpp
374         inventory.cpp
375         debug.cpp
376         serialization.cpp
377         light.cpp
378         filesys.cpp
379         connection.cpp
380         environment.cpp
381         server.cpp
382         clientiface.cpp
383         socket.cpp
384         mapblock.cpp
385         mapsector.cpp
386         map.cpp
387         database.cpp
388         database-dummy.cpp
389         database-leveldb.cpp
390         database-sqlite3.cpp
391         database-redis.cpp
392         player.cpp
393         test.cpp
394         sha1.cpp
395         base64.cpp
396         ban.cpp
397         biome.cpp
398         staticobject.cpp
399         serverlist.cpp
400         pathfinder.cpp
401         convert_json.cpp
402         gettext.cpp
403         httpfetch.cpp
404         ${JTHREAD_SRCS}
405         ${common_SCRIPT_SRCS}
406         ${UTIL_SRCS}
407 )
408
409 # This gives us the icon and file version information
410 if(WIN32)
411         set(WINRESOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc)
412         if(MINGW)
413                 if(NOT CMAKE_RC_COMPILER)
414                         set(CMAKE_RC_COMPILER "windres.exe")
415                 endif()
416                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
417                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
418                         -i${WINRESOURCE_FILE}
419                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
420                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
421                         DEPENDS ${WINRESOURCE_FILE})
422                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
423         else(MINGW) # Probably MSVC
424                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
425         endif(MINGW)
426 endif()
427
428 # Client sources
429 set(minetest_SRCS
430         ${common_SRCS}
431         ${sound_SRCS}
432         localplayer.cpp
433         sky.cpp
434         clientmap.cpp
435         content_cso.cpp
436         content_mapblock.cpp
437         content_cao.cpp
438         mesh.cpp
439         mapblock_mesh.cpp
440         keycode.cpp
441         camera.cpp
442         clouds.cpp
443         particles.cpp
444         clientobject.cpp
445         chat.cpp
446         hud.cpp
447         guiKeyChangeMenu.cpp
448         guiFormSpecMenu.cpp
449         guiTable.cpp
450         guiPasswordChange.cpp
451         guiVolumeChange.cpp
452         guiChatConsole.cpp
453         client.cpp
454         clientmedia.cpp
455         filecache.cpp
456         tile.cpp
457         shader.cpp
458         game.cpp
459         main.cpp
460         guiEngine.cpp
461         guiFileSelectMenu.cpp
462         convert_json.cpp
463         drawscene.cpp
464         ${minetest_SCRIPT_SRCS}
465 )
466 list(SORT minetest_SRCS)
467
468 # Server sources
469 set(minetestserver_SRCS
470         ${common_SRCS}
471         main.cpp
472 )
473 list(SORT minetestserver_SRCS)
474
475 include_directories(
476         ${PROJECT_BINARY_DIR}
477         ${PROJECT_SOURCE_DIR}
478         ${IRRLICHT_INCLUDE_DIR}
479         ${ZLIB_INCLUDE_DIR}
480         ${CMAKE_BUILD_TYPE}
481         ${PNG_INCLUDE_DIR}
482         ${GETTEXT_INCLUDE_DIR}
483         ${SOUND_INCLUDE_DIRS}
484         ${SQLITE3_INCLUDE_DIR}
485         ${LUA_INCLUDE_DIR}
486         ${JSON_INCLUDE_DIR}
487         ${PROJECT_SOURCE_DIR}/script
488 )
489
490 if(USE_FREETYPE)
491         include_directories(
492                 ${FREETYPE_INCLUDE_DIRS}
493                 ${CGUITTFONT_INCLUDE_DIR}
494         )
495 endif(USE_FREETYPE)
496
497 if(USE_CURL)
498         include_directories(
499                 ${CURL_INCLUDE_DIR}
500         )
501 endif(USE_CURL)
502
503 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
504
505 if(BUILD_CLIENT)
506         add_executable(${PROJECT_NAME} ${minetest_SRCS})
507         add_dependencies(${PROJECT_NAME} GenerateVersion)
508         set(minetest_LIBS
509                 ${PROJECT_NAME}
510                 ${ZLIB_LIBRARIES}
511                 ${IRRLICHT_LIBRARY}
512                 ${OPENGL_LIBRARIES}
513                 ${JPEG_LIBRARIES}
514                 ${BZIP2_LIBRARIES}
515                 ${PNG_LIBRARIES}
516                 ${X11_LIBRARIES}
517                 ${GETTEXT_LIBRARY}
518                 ${SOUND_LIBRARIES}
519                 ${SQLITE3_LIBRARY}
520                 ${LUA_LIBRARY}
521                 ${JSON_LIBRARY}
522                 ${OPENGLES2_LIBRARIES}
523                 ${PLATFORM_LIBS}
524                 ${CLIENT_PLATFORM_LIBS}
525         )
526         if(APPLE)
527                 target_link_libraries(
528                         ${minetest_LIBS}
529                         ${ICONV_LIBRARY}
530                 )
531         else()
532                 target_link_libraries(
533                         ${minetest_LIBS}
534                 )
535         endif()
536         if(USE_CURL)
537                 target_link_libraries(
538                         ${PROJECT_NAME}
539                         ${CURL_LIBRARY}
540                 )
541         endif(USE_CURL)
542         if(USE_FREETYPE)
543                 if(FREETYPE_PKGCONFIG_FOUND)
544                         set_target_properties(${PROJECT_NAME}
545                                 PROPERTIES
546                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
547                         )
548                 endif(FREETYPE_PKGCONFIG_FOUND)
549                 target_link_libraries(
550                         ${PROJECT_NAME}
551                         ${FREETYPE_LIBRARY}
552                         ${CGUITTFONT_LIBRARY}
553                 )
554         endif(USE_FREETYPE)
555         if (USE_LEVELDB)
556                 target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
557         endif(USE_LEVELDB)
558         if (USE_REDIS)
559                 target_link_libraries(${PROJECT_NAME} ${REDIS_LIBRARY})
560         endif(USE_REDIS)
561 endif(BUILD_CLIENT)
562
563 if(BUILD_SERVER)
564         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
565         add_dependencies(${PROJECT_NAME}server GenerateVersion)
566         target_link_libraries(
567                 ${PROJECT_NAME}server
568                 ${ZLIB_LIBRARIES}
569                 ${SQLITE3_LIBRARY}
570                 ${JSON_LIBRARY}
571                 ${GETTEXT_LIBRARY}
572                 ${LUA_LIBRARY}
573                 ${PLATFORM_LIBS}
574         )
575         if (USE_LEVELDB)
576                 target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
577         endif(USE_LEVELDB)
578         if (USE_REDIS)
579                 target_link_libraries(${PROJECT_NAME}server ${REDIS_LIBRARY})
580         endif(USE_REDIS)
581         if(USE_CURL)
582                 target_link_libraries(
583                         ${PROJECT_NAME}server
584                         ${CURL_LIBRARY}
585                 )
586         endif(USE_CURL)
587 endif(BUILD_SERVER)
588
589
590 #
591 # Set some optimizations and tweaks
592 #
593
594 include(CheckCXXCompilerFlag)
595
596 if(MSVC)
597         # Visual Studio
598
599         # EHa enables SEH exceptions (used for catching segfaults)
600         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")
601         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
602         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
603
604         # Debug build doesn't catch exceptions by itself
605         # Add some optimizations because otherwise it's VERY slow
606         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
607
608         # Flags for C files (sqlite)
609         # /MT = Link statically with standard library stuff
610         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
611
612         if(BUILD_SERVER)
613                 set_target_properties(${PROJECT_NAME}server PROPERTIES
614                                 COMPILE_DEFINITIONS "SERVER")
615         endif(BUILD_SERVER)
616
617 else()
618         # Probably GCC
619         if(APPLE)
620                 SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
621         endif()
622         if(WARN_ALL)
623                 set(RELEASE_WARNING_FLAGS "-Wall")
624         else()
625                 set(RELEASE_WARNING_FLAGS "")
626         endif()
627
628         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
629                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
630                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
631                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
632                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
633         endif()
634
635         if(MINGW)
636                 set(OTHER_FLAGS "-mthreads -fexceptions")
637         endif()
638
639         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops")
640         if(APPLE)
641                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
642         else()
643                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -fomit-frame-pointer")
644         endif(APPLE)
645         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}")
646
647         if(USE_GPROF)
648                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
649         endif()
650
651         if(BUILD_SERVER)
652                 set_target_properties(${PROJECT_NAME}server PROPERTIES
653                                 COMPILE_DEFINITIONS "SERVER")
654         endif(BUILD_SERVER)
655
656 endif()
657
658 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
659 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
660
661 #
662 # Installation
663 #
664 if(WIN32)
665         if(USE_SOUND)
666                 if(OPENAL_DLL)
667                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
668                 endif()
669                 if(OGG_DLL)
670                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
671                 endif()
672                 if(VORBIS_DLL)
673                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
674                 endif()
675                 if(VORBISFILE_DLL)
676                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
677                 endif()
678         endif()
679         if(CURL_DLL)
680                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
681         endif()
682         if(ZLIB_DLL)
683                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
684         endif()
685         if(ZLIBWAPI_DLL)
686                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
687         endif()
688         if(FREETYPE_DLL)
689                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
690         endif()
691         if(LEVELDB_DLL)
692                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
693         endif()
694 endif()
695
696 if(BUILD_CLIENT)
697         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
698
699         if(USE_GETTEXT)
700                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
701                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
702                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
703                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
704                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
705         endif()
706
707         if(WIN32)
708                 if(DEFINED IRRLICHT_DLL)
709                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
710                 endif()
711                 if(USE_GETTEXT)
712                         if(DEFINED GETTEXT_DLL)
713                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
714                         endif()
715                         if(DEFINED GETTEXT_ICONV_DLL)
716                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
717                         endif()
718                 endif(USE_GETTEXT)
719         endif()
720 endif(BUILD_CLIENT)
721
722 if(BUILD_SERVER)
723         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
724 endif(BUILD_SERVER)
725
726 if (USE_GETTEXT)
727         set(MO_FILES)
728
729         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
730                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
731                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
732                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
733
734                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
735                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
736                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
737
738                 add_custom_command(
739                         OUTPUT ${MO_FILE_PATH}
740                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
741                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
742                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
743                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
744                         )
745
746                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
747         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
748
749         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
750 endif(USE_GETTEXT)
751
752 # Subdirectories
753
754 if (SQLITE3_FOUND)
755 else (SQLITE3_FOUND)
756         add_subdirectory(sqlite)
757 endif (SQLITE3_FOUND)
758
759 if (BUILD_CLIENT AND USE_FREETYPE)
760         add_subdirectory(cguittfont)
761 endif (BUILD_CLIENT AND USE_FREETYPE)
762
763 if (JSON_FOUND)
764 else (JSON_FOUND)
765         add_subdirectory(json)
766 endif (JSON_FOUND)
767
768 #end