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