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