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