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