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