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