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