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