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