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