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