]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
ec6c7fbac08dbfdacc35dc398052308304d012ed
[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
319 configure_file(
320         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
321         "${PROJECT_BINARY_DIR}/cmake_config.h"
322 )
323
324 # Add a target that always rebuilds cmake_config_githash.h
325 add_custom_target(GenerateVersion
326         COMMAND ${CMAKE_COMMAND}
327         -D "GENERATE_VERSION_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
328         -D "GENERATE_VERSION_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
329         -D "VERSION_STRING=${VERSION_STRING}"
330         -D "VERSION_EXTRA=${VERSION_EXTRA}"
331         -P "${CMAKE_SOURCE_DIR}/cmake/Modules/GenerateVersion.cmake"
332         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
333
334 add_subdirectory(jthread)
335 add_subdirectory(script)
336 add_subdirectory(util)
337
338 set(common_SRCS
339         ban.cpp
340         base64.cpp
341         cavegen.cpp
342         clientiface.cpp
343         collision.cpp
344         connection.cpp
345         content_abm.cpp
346         content_mapnode.cpp
347         content_nodemeta.cpp
348         content_sao.cpp
349         convert_json.cpp
350         craftdef.cpp
351         database-dummy.cpp
352         database-leveldb.cpp
353         database-redis.cpp
354         database-sqlite3.cpp
355         database.cpp
356         debug.cpp
357         defaultsettings.cpp
358         dungeongen.cpp
359         emerge.cpp
360         environment.cpp
361         filesys.cpp
362         genericobject.cpp
363         gettext.cpp
364         httpfetch.cpp
365         inventory.cpp
366         inventorymanager.cpp
367         itemdef.cpp
368         light.cpp
369         log.cpp
370         map.cpp
371         mapblock.cpp
372         mapgen.cpp
373         mapgen_singlenode.cpp
374         mapgen_v5.cpp
375         mapgen_v6.cpp
376         mapgen_v7.cpp
377         mapnode.cpp
378         mapsector.cpp
379         mg_biome.cpp
380         mg_decoration.cpp
381         mg_ore.cpp
382         mg_schematic.cpp
383         mods.cpp
384         nameidmapping.cpp
385         nodedef.cpp
386         nodemetadata.cpp
387         nodetimer.cpp
388         noise.cpp
389         object_properties.cpp
390         pathfinder.cpp
391         player.cpp
392         porting.cpp
393         quicktune.cpp
394         rollback.cpp
395         rollback_interface.cpp
396         serialization.cpp
397         server.cpp
398         serverlist.cpp
399         serverobject.cpp
400         settings.cpp
401         sha1.cpp
402         socket.cpp
403         sound.cpp
404         staticobject.cpp
405         subgame.cpp
406         test.cpp
407         tool.cpp
408         treegen.cpp
409         version.cpp
410         voxel.cpp
411         voxelalgorithms.cpp
412         ${JTHREAD_SRCS}
413         ${common_SCRIPT_SRCS}
414         ${UTIL_SRCS}
415 )
416
417 # This gives us the icon and file version information
418 if(WIN32)
419         set(WINRESOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc)
420         if(MINGW)
421                 if(NOT CMAKE_RC_COMPILER)
422                         set(CMAKE_RC_COMPILER "windres.exe")
423                 endif()
424                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
425                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
426                         -i${WINRESOURCE_FILE}
427                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
428                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
429                         DEPENDS ${WINRESOURCE_FILE})
430                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
431         else(MINGW) # Probably MSVC
432                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
433         endif(MINGW)
434 endif()
435
436 # Client sources
437 set(minetest_SRCS
438         ${common_SRCS}
439         ${sound_SRCS}
440         camera.cpp
441         chat.cpp
442         client.cpp
443         clientmap.cpp
444         clientmedia.cpp
445         clientobject.cpp
446         clouds.cpp
447         content_cao.cpp
448         content_cso.cpp
449         content_mapblock.cpp
450         convert_json.cpp
451         drawscene.cpp
452         filecache.cpp
453         game.cpp
454         guiChatConsole.cpp
455         guiEngine.cpp
456         guiFileSelectMenu.cpp
457         guiFormSpecMenu.cpp
458         guiKeyChangeMenu.cpp
459         guiPasswordChange.cpp
460         guiTable.cpp
461         guiVolumeChange.cpp
462         hud.cpp
463         keycode.cpp
464         localplayer.cpp
465         main.cpp
466         mapblock_mesh.cpp
467         mesh.cpp
468         particles.cpp
469         shader.cpp
470         sky.cpp
471         tile.cpp
472         wieldmesh.cpp
473         ${minetest_SCRIPT_SRCS}
474 )
475 list(SORT minetest_SRCS)
476
477 # Server sources
478 set(minetestserver_SRCS
479         ${common_SRCS}
480         main.cpp
481 )
482 list(SORT minetestserver_SRCS)
483
484 include_directories(
485         ${PROJECT_BINARY_DIR}
486         ${PROJECT_SOURCE_DIR}
487         ${IRRLICHT_INCLUDE_DIR}
488         ${ZLIB_INCLUDE_DIR}
489         ${CMAKE_BUILD_TYPE}
490         ${PNG_INCLUDE_DIR}
491         ${GETTEXT_INCLUDE_DIR}
492         ${SOUND_INCLUDE_DIRS}
493         ${SQLITE3_INCLUDE_DIR}
494         ${LUA_INCLUDE_DIR}
495         ${JSON_INCLUDE_DIR}
496         ${PROJECT_SOURCE_DIR}/script
497 )
498
499 if(USE_FREETYPE)
500         include_directories(
501                 ${FREETYPE_INCLUDE_DIRS}
502                 ${CGUITTFONT_INCLUDE_DIR}
503         )
504 endif(USE_FREETYPE)
505
506 if(USE_CURL)
507         include_directories(
508                 ${CURL_INCLUDE_DIR}
509         )
510 endif(USE_CURL)
511
512 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
513
514 if(BUILD_CLIENT)
515         add_executable(${PROJECT_NAME} ${minetest_SRCS})
516         add_dependencies(${PROJECT_NAME} GenerateVersion)
517         set(minetest_LIBS
518                 ${PROJECT_NAME}
519                 ${ZLIB_LIBRARIES}
520                 ${IRRLICHT_LIBRARY}
521                 ${OPENGL_LIBRARIES}
522                 ${JPEG_LIBRARIES}
523                 ${BZIP2_LIBRARIES}
524                 ${PNG_LIBRARIES}
525                 ${X11_LIBRARIES}
526                 ${GETTEXT_LIBRARY}
527                 ${SOUND_LIBRARIES}
528                 ${SQLITE3_LIBRARY}
529                 ${LUA_LIBRARY}
530                 ${JSON_LIBRARY}
531                 ${OPENGLES2_LIBRARIES}
532                 ${PLATFORM_LIBS}
533                 ${CLIENT_PLATFORM_LIBS}
534         )
535         if(APPLE)
536                 target_link_libraries(
537                         ${minetest_LIBS}
538                         ${ICONV_LIBRARY}
539                 )
540         else()
541                 target_link_libraries(
542                         ${minetest_LIBS}
543                 )
544         endif()
545         if(USE_CURL)
546                 target_link_libraries(
547                         ${PROJECT_NAME}
548                         ${CURL_LIBRARY}
549                 )
550         endif(USE_CURL)
551         if(USE_FREETYPE)
552                 if(FREETYPE_PKGCONFIG_FOUND)
553                         set_target_properties(${PROJECT_NAME}
554                                 PROPERTIES
555                                 COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}"
556                         )
557                 endif(FREETYPE_PKGCONFIG_FOUND)
558                 target_link_libraries(
559                         ${PROJECT_NAME}
560                         ${FREETYPE_LIBRARY}
561                         ${CGUITTFONT_LIBRARY}
562                 )
563         endif(USE_FREETYPE)
564         if (USE_LEVELDB)
565                 target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
566         endif(USE_LEVELDB)
567         if (USE_REDIS)
568                 target_link_libraries(${PROJECT_NAME} ${REDIS_LIBRARY})
569         endif(USE_REDIS)
570 endif(BUILD_CLIENT)
571
572 if(BUILD_SERVER)
573         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
574         add_dependencies(${PROJECT_NAME}server GenerateVersion)
575         target_link_libraries(
576                 ${PROJECT_NAME}server
577                 ${ZLIB_LIBRARIES}
578                 ${SQLITE3_LIBRARY}
579                 ${JSON_LIBRARY}
580                 ${GETTEXT_LIBRARY}
581                 ${LUA_LIBRARY}
582                 ${PLATFORM_LIBS}
583         )
584         if (USE_LEVELDB)
585                 target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
586         endif(USE_LEVELDB)
587         if (USE_REDIS)
588                 target_link_libraries(${PROJECT_NAME}server ${REDIS_LIBRARY})
589         endif(USE_REDIS)
590         if(USE_CURL)
591                 target_link_libraries(
592                         ${PROJECT_NAME}server
593                         ${CURL_LIBRARY}
594                 )
595         endif(USE_CURL)
596 endif(BUILD_SERVER)
597
598
599 #
600 # Set some optimizations and tweaks
601 #
602
603 include(CheckCXXCompilerFlag)
604
605 if(MSVC)
606         # Visual Studio
607
608         # EHa enables SEH exceptions (used for catching segfaults)
609         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")
610         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
611         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
612
613         # Debug build doesn't catch exceptions by itself
614         # Add some optimizations because otherwise it's VERY slow
615         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
616
617         # Flags for C files (sqlite)
618         # /MT = Link statically with standard library stuff
619         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
620
621         if(BUILD_SERVER)
622                 set_target_properties(${PROJECT_NAME}server PROPERTIES
623                                 COMPILE_DEFINITIONS "SERVER")
624         endif(BUILD_SERVER)
625
626 else()
627         # Probably GCC
628         if(APPLE)
629                 SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000" )
630         endif()
631         if(WARN_ALL)
632                 set(RELEASE_WARNING_FLAGS "-Wall")
633         else()
634                 set(RELEASE_WARNING_FLAGS "")
635         endif()
636
637         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
638                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
639                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
640                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
641                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
642         endif()
643
644         if(MINGW)
645                 set(OTHER_FLAGS "-mthreads -fexceptions")
646         endif()
647
648         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops")
649         if(APPLE)
650                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
651         else()
652                 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -fomit-frame-pointer")
653         endif(APPLE)
654         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}")
655
656         if(USE_GPROF)
657                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
658         endif()
659
660         if(BUILD_SERVER)
661                 set_target_properties(${PROJECT_NAME}server PROPERTIES
662                                 COMPILE_DEFINITIONS "SERVER")
663         endif(BUILD_SERVER)
664
665 endif()
666
667 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
668 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
669
670 #
671 # Installation
672 #
673 if(WIN32)
674         if(USE_SOUND)
675                 if(OPENAL_DLL)
676                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
677                 endif()
678                 if(OGG_DLL)
679                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
680                 endif()
681                 if(VORBIS_DLL)
682                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
683                 endif()
684                 if(VORBISFILE_DLL)
685                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
686                 endif()
687         endif()
688         if(CURL_DLL)
689                 install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
690         endif()
691         if(ZLIB_DLL)
692                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
693         endif()
694         if(ZLIBWAPI_DLL)
695                 install(FILES ${ZLIBWAPI_DLL} DESTINATION ${BINDIR})
696         endif()
697         if(FREETYPE_DLL)
698                 install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR})
699         endif()
700         if(LEVELDB_DLL)
701                 install(FILES ${LEVELDB_DLL} DESTINATION ${BINDIR})
702         endif()
703 endif()
704
705 if(BUILD_CLIENT)
706         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
707
708         if(USE_GETTEXT)
709                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
710                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
711                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
712                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
713                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
714         endif()
715
716         if(WIN32)
717                 if(DEFINED IRRLICHT_DLL)
718                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
719                 endif()
720                 if(USE_GETTEXT)
721                         if(DEFINED GETTEXT_DLL)
722                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
723                         endif()
724                         if(DEFINED GETTEXT_ICONV_DLL)
725                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
726                         endif()
727                 endif(USE_GETTEXT)
728         endif()
729 endif(BUILD_CLIENT)
730
731 if(BUILD_SERVER)
732         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
733 endif(BUILD_SERVER)
734
735 if (USE_GETTEXT)
736         set(MO_FILES)
737
738         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
739                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
740                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
741                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
742
743                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
744                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
745                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
746
747                 add_custom_command(
748                         OUTPUT ${MO_FILE_PATH}
749                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
750                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
751                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
752                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
753                         )
754
755                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
756         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
757
758         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
759 endif(USE_GETTEXT)
760
761 # Subdirectories
762
763 if (SQLITE3_FOUND)
764 else (SQLITE3_FOUND)
765         add_subdirectory(sqlite)
766 endif (SQLITE3_FOUND)
767
768 if (BUILD_CLIENT AND USE_FREETYPE)
769         add_subdirectory(cguittfont)
770 endif (BUILD_CLIENT AND USE_FREETYPE)
771
772 if (JSON_FOUND)
773 else (JSON_FOUND)
774         add_subdirectory(json)
775 endif (JSON_FOUND)
776
777 #end