]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
Merge remote-tracking branch 'origin/master'
[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 configure_file(
205         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
206         "${PROJECT_BINARY_DIR}/cmake_config.h"
207 )
208
209 add_subdirectory(script)
210 add_subdirectory(util)
211
212 set(common_SRCS
213         rollback_interface.cpp
214         rollback.cpp
215         genericobject.cpp
216         voxelalgorithms.cpp
217         sound.cpp
218         quicktune.cpp
219         subgame.cpp
220         inventorymanager.cpp
221         mods.cpp
222         content_abm.cpp
223         craftdef.cpp
224         nameidmapping.cpp
225         itemdef.cpp
226         nodedef.cpp
227         object_properties.cpp
228         log.cpp
229         content_sao.cpp
230         emerge.cpp
231         mapgen.cpp
232         mapgen_v6.cpp
233         mapgen_v7.cpp
234         mapgen_indev.cpp
235         mapgen_singlenode.cpp
236         treegen.cpp
237         dungeongen.cpp
238         cavegen.cpp
239         content_nodemeta.cpp
240         content_mapnode.cpp
241         collision.cpp
242         nodemetadata.cpp
243         nodetimer.cpp
244         serverobject.cpp
245         noise.cpp
246         porting.cpp
247         tool.cpp
248         defaultsettings.cpp
249         mapnode.cpp
250         voxel.cpp
251         inventory.cpp
252         debug.cpp
253         serialization.cpp
254         light.cpp
255         filesys.cpp
256         connection.cpp
257         environment.cpp
258         server.cpp
259         socket.cpp
260         mapblock.cpp
261         mapsector.cpp
262         map.cpp
263         player.cpp
264         test.cpp
265         sha1.cpp
266         base64.cpp
267         ban.cpp
268         biome.cpp
269         clientserver.cpp
270         staticobject.cpp
271         serverlist.cpp
272         pathfinder.cpp
273         ${SCRIPT_SRCS}
274         ${UTIL_SRCS}
275 )
276
277 # This gives us the icon
278 if(WIN32)
279         set(WINRESOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc)
280         if(MINGW)
281                 if(NOT CMAKE_RC_COMPILER)
282                         set(CMAKE_RC_COMPILER "windres.exe")
283                 endif()
284                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
285                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR}
286                         -i${WINRESOURCE_FILE}
287                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
288                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
289                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
290         else(MINGW) # Probably MSVC
291                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
292         endif(MINGW)
293 endif()
294
295 # Client sources
296 set(minetest_SRCS
297         ${common_SRCS}
298         ${sound_SRCS}
299         localplayer.cpp
300         sky.cpp
301         clientmap.cpp
302         content_cso.cpp
303         content_mapblock.cpp
304         content_cao.cpp
305         mesh.cpp
306         mapblock_mesh.cpp
307         farmesh.cpp
308         keycode.cpp
309         camera.cpp
310         clouds.cpp
311         particles.cpp
312         clientobject.cpp
313         chat.cpp
314         hud.cpp
315         guiMainMenu.cpp
316         guiKeyChangeMenu.cpp
317         guiMessageMenu.cpp
318         guiTextInputMenu.cpp
319         guiFormSpecMenu.cpp
320         guiPauseMenu.cpp
321         guiPasswordChange.cpp
322         guiVolumeChange.cpp
323         guiDeathScreen.cpp
324         guiChatConsole.cpp
325         guiCreateWorld.cpp
326         guiConfigureWorld.cpp
327         guiConfirmMenu.cpp
328         client.cpp
329         filecache.cpp
330         tile.cpp
331         shader.cpp
332         game.cpp
333         main.cpp
334 )
335
336 if(USE_FREETYPE)
337         set(minetest_SRCS
338                 ${minetest_SRCS}
339                 intlGUIEditBox.cpp
340         )
341 endif(USE_FREETYPE)
342
343 # Server sources
344 set(minetestserver_SRCS
345         ${common_SRCS}
346         main.cpp
347 )
348
349 include_directories(
350         ${PROJECT_BINARY_DIR}
351         ${PROJECT_SOURCE_DIR}
352         ${IRRLICHT_INCLUDE_DIR}
353         ${ZLIB_INCLUDE_DIR}
354         ${CMAKE_BUILD_TYPE}
355         ${PNG_INCLUDE_DIR}
356         ${GETTEXT_INCLUDE_DIR}
357         ${SOUND_INCLUDE_DIRS}
358         ${JTHREAD_INCLUDE_DIR}
359         ${SQLITE3_INCLUDE_DIR}
360         ${LUA_INCLUDE_DIR}
361         ${JSON_INCLUDE_DIR}
362         ${PROJECT_SOURCE_DIR}/script
363 )
364
365 if(USE_FREETYPE)
366         include_directories(
367                 ${FREETYPE_INCLUDE_DIRS}
368                 ${CGUITTFONT_INCLUDE_DIR}
369         )
370 endif(USE_FREETYPE)
371
372 if(USE_CURL)
373         include_directories(
374                 ${CURL_INCLUDE_DIR}
375         )
376 endif(USE_CURL)
377
378 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
379
380 if(BUILD_CLIENT)
381         add_executable(${PROJECT_NAME} ${minetest_SRCS})
382         target_link_libraries(
383                 ${PROJECT_NAME}
384                 ${ZLIB_LIBRARIES}
385                 ${IRRLICHT_LIBRARY}
386                 ${OPENGL_LIBRARIES}
387                 ${JPEG_LIBRARIES}
388                 ${BZIP2_LIBRARIES}
389                 ${PNG_LIBRARIES}
390                 ${X11_LIBRARIES}
391                 ${GETTEXT_LIBRARY}
392                 ${SOUND_LIBRARIES}
393                 ${JTHREAD_LIBRARY}
394                 ${SQLITE3_LIBRARY}
395                 ${LUA_LIBRARY}
396                 ${JSON_LIBRARY}
397                 ${OPENGLES2_LIBRARIES}
398                 ${PLATFORM_LIBS}
399                 ${CLIENT_PLATFORM_LIBS}
400         )
401         if(USE_CURL)
402                 target_link_libraries(
403                         ${PROJECT_NAME}
404                         ${CURL_LIBRARY}
405                 )
406         endif(USE_CURL)
407         if(USE_FREETYPE)
408                 target_link_libraries(
409                         ${PROJECT_NAME}
410                         ${FREETYPE_LIBRARY}
411                         ${CGUITTFONT_LIBRARY}
412                 )
413         endif(USE_FREETYPE)
414 endif(BUILD_CLIENT)
415
416 if(BUILD_SERVER)
417         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
418         target_link_libraries(
419                 ${PROJECT_NAME}server
420                 ${ZLIB_LIBRARIES}
421                 ${JTHREAD_LIBRARY}
422                 ${SQLITE3_LIBRARY}
423                 ${JSON_LIBRARY}
424                 ${GETTEXT_LIBRARY}
425                 ${LUA_LIBRARY}
426                 ${PLATFORM_LIBS}
427         )
428         if(USE_CURL)
429                 target_link_libraries(
430                         ${PROJECT_NAME}server
431                         ${CURL_LIBRARY}
432                 )
433         endif(USE_CURL)
434 endif(BUILD_SERVER)
435
436
437 #
438 # Set some optimizations and tweaks
439 #
440
441 include(CheckCXXCompilerFlag)
442
443 if(MSVC)
444         # Visual Studio
445
446         # EHa enables SEH exceptions (used for catching segfaults)
447         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")
448         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
449         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
450
451         # Debug build doesn't catch exceptions by itself
452         # Add some optimizations because otherwise it's VERY slow
453         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
454
455         # Flags for C files (sqlite)
456         # /MT = Link statically with standard library stuff
457         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
458         
459         if(BUILD_SERVER)
460                 set_target_properties(${PROJECT_NAME}server PROPERTIES
461                                 COMPILE_DEFINITIONS "SERVER")
462         endif(BUILD_SERVER)
463
464 else()
465         # Probably GCC
466         
467         if(WARN_ALL)
468                 set(RELEASE_WARNING_FLAGS "-Wall")
469         else()
470                 set(RELEASE_WARNING_FLAGS "")
471         endif()
472         
473         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
474                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
475                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
476                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
477                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
478         endif()
479
480         if(MINGW)
481                 set(OTHER_FLAGS "-mthreads -fexceptions")
482         endif()
483
484         if(APPLE)
485                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
486                 set(ARCH i386)
487         endif()
488
489         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
490         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}")
491
492         if(USE_GPROF)
493                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
494         endif()
495         
496         if(BUILD_SERVER)
497                 set_target_properties(${PROJECT_NAME}server PROPERTIES
498                                 COMPILE_DEFINITIONS "SERVER")
499         endif(BUILD_SERVER)
500
501 endif()
502
503 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
504 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
505
506 #
507 # Installation
508 #
509 if(WIN32)
510         if(MINGWM10_DLL)
511                 install(FILES ${MINGWM10_DLL} DESTINATION ${BINDIR})
512         endif()
513         if(DEFINED ZLIB_DLL)
514                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
515         endif()
516         if(USE_SOUND)
517                 if(OPENAL_DLL)
518                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
519                 endif()
520                 if(OGG_DLL)
521                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
522                 endif()
523                 if(VORBIS_DLL)
524                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
525                 endif()
526                 if(VORBISFILE_DLL)
527                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
528                 endif()
529                 if(CURL_DLL)
530                         install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
531                 endif()
532         endif()
533 endif()
534
535 if(BUILD_CLIENT)
536         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
537
538         if(USE_GETTEXT)
539                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
540                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
541                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
542                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
543                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
544         endif()
545
546         if(WIN32)
547                 if(DEFINED IRRLICHT_DLL)
548                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
549                 endif()
550                 if(USE_GETTEXT)
551                         if(DEFINED GETTEXT_DLL)
552                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
553                         endif()
554                         if(DEFINED GETTEXT_ICONV_DLL)
555                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
556                         endif()
557                 endif(USE_GETTEXT)
558         endif()
559 endif(BUILD_CLIENT)
560
561 if(BUILD_SERVER)
562         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
563 endif(BUILD_SERVER)
564
565 if (USE_GETTEXT)
566         set(MO_FILES)
567
568         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
569                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
570                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
571                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
572
573                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
574                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
575                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
576
577                 add_custom_command(
578                         OUTPUT ${MO_FILE_PATH}
579                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
580                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
581                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
582                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
583                         )
584
585                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
586         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
587
588         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
589 endif(USE_GETTEXT)
590
591 # Subdirectories
592
593 if (JTHREAD_FOUND)
594 else (JTHREAD_FOUND)
595         add_subdirectory(jthread)
596 endif (JTHREAD_FOUND)
597
598 if (SQLITE3_FOUND)
599 else (SQLITE3_FOUND)
600         add_subdirectory(sqlite)
601 endif (SQLITE3_FOUND)
602
603 if (BUILD_CLIENT AND USE_FREETYPE)
604         add_subdirectory(cguittfont)
605 endif (BUILD_CLIENT AND USE_FREETYPE)
606
607 if (JSON_FOUND)
608 else (JSON_FOUND)
609         add_subdirectory(json)
610 endif (JSON_FOUND)
611
612 #end