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