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