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