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