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