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