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