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