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