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