]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
Improve node timer format (map format version 25) and update mapformat.txt
[minetest.git] / src / CMakeLists.txt
1 project(minetest)
2 cmake_minimum_required( VERSION 2.6 )
3
4 # Set some random things default to not being visible in the GUI
5 mark_as_advanced(EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH)
6 mark_as_advanced(JTHREAD_INCLUDE_DIR JTHREAD_LIBRARY)
7 mark_as_advanced(SQLITE3_INCLUDE_DIR SQLITE3_LIBRARY)
8
9 # user-visible option to enable/disable gettext usage
10 OPTION(ENABLE_GETTEXT "Use GetText for internationalization" 0)
11
12 # this is only set to 1 if gettext is enabled _and_ available
13 set(USE_GETTEXT 0)
14
15 if(ENABLE_GETTEXT)
16         find_package(GettextLib)
17 else()
18         MARK_AS_ADVANCED(GETTEXT_ICONV_DLL GETTEXT_INCLUDE_DIR GETTEXT_LIBRARY GETTEXT_MSGFMT)
19 endif()
20
21 if(GETTEXT_FOUND AND ENABLE_GETTEXT)
22         message(STATUS "gettext include path: ${GETTEXT_INCLUDE_DIR}")
23         message(STATUS "gettext msgfmt path: ${GETTEXT_MSGFMT}")
24         if(WIN32)
25                 message(STATUS "gettext library: ${GETTEXT_LIBRARY}")
26                 message(STATUS "gettext dll: ${GETTEXT_DLL}")
27                 message(STATUS "gettext iconv dll: ${GETTEXT_ICONV_DLL}")
28         endif()
29         set(USE_GETTEXT 1)
30         message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
31 elseif(GETTEXT_FOUND AND NOT ENABLE_GETTEXT)
32         MESSAGE(STATUS "GetText found but disabled;")
33 else(GETTEXT_FOUND AND ENABLE_GETTEXT)
34         message(STATUS "GetText disabled")
35 endif(GETTEXT_FOUND AND ENABLE_GETTEXT)
36
37 # user visible option to enable/disable sound
38 OPTION(ENABLE_SOUND "Enable sound" ON)
39
40 # this is only set to 1 if sound is enabled _and_ available
41 set(USE_SOUND 0)
42 set(SOUND_PROBLEM 0)
43
44 if(ENABLE_SOUND AND BUILD_CLIENT)
45         # Sound libraries
46         find_package(OpenAL)
47         find_package(Vorbis)
48         if(NOT OPENAL_FOUND)
49                 message(STATUS "Sound enabled, but OpenAL not found!")
50                 set(SOUND_PROBLEM 1)
51                 MARK_AS_ADVANCED(CLEAR OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
52         endif()
53         if(NOT VORBIS_FOUND)
54                 message(STATUS "Sound enabled, but Vorbis libraries not found!")
55                 set(SOUND_PROBLEM 1)
56                 MARK_AS_ADVANCED(CLEAR OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)
57         endif()
58         if(OPENAL_FOUND AND VORBIS_FOUND)
59                 set(USE_SOUND 1)
60                 message(STATUS "Sound enabled")
61         endif()
62 endif(ENABLE_SOUND AND BUILD_CLIENT)
63
64 if(SOUND_PROBLEM)
65         message(FATAL_ERROR "Sound enabled, but cannot be used.\n"
66                 "To continue, either fill in the required paths or disable sound. (-DENABLE_SOUND=0)")
67 endif()
68 if(USE_SOUND)
69         set(sound_SRCS sound_openal.cpp)
70         set(SOUND_INCLUDE_DIRS
71                 ${OPENAL_INCLUDE_DIR}
72                 ${VORBIS_INCLUDE_DIR}
73                 ${OGG_INCLUDE_DIR}
74                 )
75         set(SOUND_LIBRARIES
76                 ${OPENAL_LIBRARY}
77                 ${VORBIS_LIBRARIES}
78                 )
79 endif()
80
81 if(NOT MSVC)
82         set(USE_GPROF 0 CACHE BOOL "Use -pg flag for g++")
83 endif()
84
85 # Use cmake_config.h
86 add_definitions ( -DUSE_CMAKE_CONFIG_H )
87
88 if(WIN32)
89         # Windows
90         if(MSVC) # MSVC Specifics
91                 # Surpress some useless warnings
92                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
93         else() # Probably MinGW = GCC
94                 set(PLATFORM_LIBS ws2_32.lib)
95         endif()
96         # Zlib stuff
97         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
98                         CACHE PATH "Zlib include directory")
99         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
100                         CACHE FILEPATH "Path to zlibwapi.lib")
101         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
102                         CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
103         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
104                         CACHE PATH "irrlicht dir")
105         set(MINGWM10_DLL ""
106                         CACHE FILEPATH "Path to mingwm10.dll (for installation)")
107         if(ENABLE_SOUND)
108                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
109                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
110                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
111                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
112         endif()
113 else()
114         # Unix probably
115         if(BUILD_CLIENT)
116                 find_package(X11 REQUIRED)
117                 find_package(OpenGL REQUIRED)
118                 find_package(JPEG REQUIRED)
119                 find_package(BZip2 REQUIRED)
120                 find_package(PNG REQUIRED)
121                 if(APPLE)
122                         FIND_LIBRARY(CARBON_LIB Carbon)
123                         FIND_LIBRARY(COCOA_LIB Cocoa)
124                         FIND_LIBRARY(IOKIT_LIB IOKit)
125                         mark_as_advanced(
126                                 CARBON_LIB
127                                 COCOA_LIB
128                                 IOKIT_LIB
129                         )
130                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
131                 endif(APPLE)
132         endif(BUILD_CLIENT)
133         find_package(ZLIB REQUIRED)
134         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
135         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
136         # This way Xxf86vm is found on OpenBSD too
137         find_library(XXF86VM_LIBRARY Xxf86vm)
138         mark_as_advanced(XXF86VM_LIBRARY)
139         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
140 endif()
141
142 find_package(Jthread REQUIRED)
143 find_package(Sqlite3 REQUIRED)
144
145 # Do not use system-wide installation of Lua, because it'll likely be a
146 # different version and/or has different build options.
147 set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
148 set(LUA_LIBRARY "lua")
149
150 configure_file(
151         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
152         "${PROJECT_BINARY_DIR}/cmake_config.h"
153 )
154
155 set(common_SRCS
156         genericobject.cpp
157         voxelalgorithms.cpp
158         sound.cpp
159         quicktune.cpp
160         subgame.cpp
161         inventorymanager.cpp
162         mods.cpp
163         content_abm.cpp
164         craftdef.cpp
165         nameidmapping.cpp
166         itemdef.cpp
167         nodedef.cpp
168         object_properties.cpp
169         scriptapi.cpp
170         script.cpp
171         log.cpp
172         content_sao.cpp
173         mapgen.cpp
174         content_nodemeta.cpp
175         content_mapnode.cpp
176         collision.cpp
177         nodemetadata.cpp
178         nodetimer.cpp
179         serverobject.cpp
180         noise.cpp
181         porting.cpp
182         tool.cpp
183         defaultsettings.cpp
184         mapnode.cpp
185         voxel.cpp
186         inventory.cpp
187         debug.cpp
188         serialization.cpp
189         light.cpp
190         filesys.cpp
191         connection.cpp
192         environment.cpp
193         server.cpp
194         servercommand.cpp
195         socket.cpp
196         mapblock.cpp
197         mapsector.cpp
198         map.cpp
199         player.cpp
200         test.cpp
201         sha1.cpp
202         base64.cpp
203         ban.cpp
204         util/serialize.cpp
205         util/directiontables.cpp
206         util/numeric.cpp
207         util/pointedthing.cpp
208         util/string.cpp
209         util/timetaker.cpp
210 )
211
212 # This gives us the icon
213 if(WIN32)
214         set(WINRESOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc)
215         if(MINGW)
216                 if(NOT CMAKE_RC_COMPILER)
217                         set(CMAKE_RC_COMPILER "windres.exe")
218                 endif()
219                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
220                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR}
221                         -i${WINRESOURCE_FILE}
222                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
223                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
224                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
225         else(MINGW) # Probably MSVC
226                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
227         endif(MINGW)
228 endif()
229
230 # Client sources
231 set(minetest_SRCS
232         ${common_SRCS}
233         ${sound_SRCS}
234         localplayer.cpp
235         sky.cpp
236         clientmap.cpp
237         content_cso.cpp
238         content_mapblock.cpp
239         content_cao.cpp
240         mesh.cpp
241         mapblock_mesh.cpp
242         farmesh.cpp
243         keycode.cpp
244         camera.cpp
245         clouds.cpp
246         clientobject.cpp
247         chat.cpp
248         guiMainMenu.cpp
249         guiKeyChangeMenu.cpp
250         guiMessageMenu.cpp
251         guiTextInputMenu.cpp
252         guiFormSpecMenu.cpp
253         guiPauseMenu.cpp
254         guiPasswordChange.cpp
255         guiDeathScreen.cpp
256         guiChatConsole.cpp
257         guiCreateWorld.cpp
258         guiConfirmMenu.cpp
259         client.cpp
260         filecache.cpp
261         tile.cpp
262         game.cpp
263         main.cpp
264 )
265
266 # Server sources
267 set(minetestserver_SRCS
268         ${common_SRCS}
269         main.cpp
270 )
271
272 include_directories(
273         ${PROJECT_BINARY_DIR}
274         ${IRRLICHT_INCLUDE_DIR}
275         ${ZLIB_INCLUDE_DIR}
276         ${CMAKE_BUILD_TYPE}
277         ${PNG_INCLUDE_DIR}
278         ${GETTEXT_INCLUDE_DIR}
279         ${SOUND_INCLUDE_DIRS}
280         ${JTHREAD_INCLUDE_DIR}
281         ${SQLITE3_INCLUDE_DIR}
282         ${LUA_INCLUDE_DIR}
283 )
284
285 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
286
287 if(BUILD_CLIENT)
288         add_executable(${PROJECT_NAME} ${minetest_SRCS})
289         target_link_libraries(
290                 ${PROJECT_NAME}
291                 ${ZLIB_LIBRARIES}
292                 ${IRRLICHT_LIBRARY}
293                 ${OPENGL_LIBRARIES}
294                 ${JPEG_LIBRARIES}
295                 ${BZIP2_LIBRARIES}
296                 ${PNG_LIBRARIES}
297                 ${X11_LIBRARIES}
298                 ${GETTEXT_LIBRARY}
299                 ${SOUND_LIBRARIES}
300                 ${JTHREAD_LIBRARY}
301                 ${SQLITE3_LIBRARY}
302                 ${LUA_LIBRARY}
303                 ${PLATFORM_LIBS}
304                 ${CLIENT_PLATFORM_LIBS}
305         )
306 endif(BUILD_CLIENT)
307
308 if(BUILD_SERVER)
309         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
310         target_link_libraries(
311                 ${PROJECT_NAME}server
312                 ${ZLIB_LIBRARIES}
313                 ${JTHREAD_LIBRARY}
314                 ${SQLITE3_LIBRARY}
315                 ${LUA_LIBRARY}
316                 ${PLATFORM_LIBS}
317         )
318 endif(BUILD_SERVER)
319
320 #
321 # Set some optimizations and tweaks
322 #
323
324 include(CheckCXXCompilerFlag)
325
326 if(MSVC)
327         # Visual Studio
328
329         # EHa enables SEH exceptions (used for catching segfaults)
330         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")
331         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
332         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
333
334         # Debug build doesn't catch exceptions by itself
335         # Add some optimizations because otherwise it's VERY slow
336         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
337
338         # Flags for C files (sqlite)
339         # /MT = Link statically with standard library stuff
340         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
341         
342         if(BUILD_SERVER)
343                 set_target_properties(${PROJECT_NAME}server PROPERTIES
344                                 COMPILE_DEFINITIONS "SERVER")
345         endif(BUILD_SERVER)
346
347 else()
348         # Probably GCC
349         
350         if(WARN_ALL)
351                 set(RELEASE_WARNING_FLAGS "-Wall")
352         else()
353                 set(RELEASE_WARNING_FLAGS "")
354         endif()
355         
356         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
357                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
358                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
359                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
360                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
361         endif()
362
363         if(MINGW)
364                 set(OTHER_FLAGS "-mthreads -fexceptions")
365         endif()
366
367         if(APPLE)
368                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
369                 set(ARCH i386)
370         endif()
371
372         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
373         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}")
374
375         if(USE_GPROF)
376                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
377         endif()
378         
379         if(BUILD_SERVER)
380                 set_target_properties(${PROJECT_NAME}server PROPERTIES
381                                 COMPILE_DEFINITIONS "SERVER")
382         endif(BUILD_SERVER)
383
384 endif()
385
386 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
387 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
388
389 #
390 # Installation
391 #
392 if(WIN32)
393         if(MINGWM10_DLL)
394                 install(FILES ${MINGWM10_DLL} DESTINATION ${BINDIR})
395         endif()
396         if(DEFINED ZLIB_DLL)
397                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
398         endif()
399         if(USE_SOUND)
400                 if(OPENAL_DLL)
401                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
402                 endif()
403                 if(OGG_DLL)
404                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
405                 endif()
406                 if(VORBIS_DLL)
407                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
408                 endif()
409                 if(VORBISFILE_DLL)
410                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
411                 endif()
412         endif()
413 endif()
414
415 if(BUILD_CLIENT)
416         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
417
418         if(USE_GETTEXT)
419                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
420                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
421                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
422                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
423                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
424         endif()
425
426         if(WIN32)
427                 if(DEFINED IRRLICHT_DLL)
428                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
429                 endif()
430                 if(USE_GETTEXT)
431                         if(DEFINED GETTEXT_DLL)
432                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
433                         endif()
434                         if(DEFINED GETTEXT_ICONV_DLL)
435                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
436                         endif()
437                 endif(USE_GETTEXT)
438         endif()
439 endif(BUILD_CLIENT)
440
441 if(BUILD_SERVER)
442         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
443 endif(BUILD_SERVER)
444
445 if (USE_GETTEXT)
446         set(MO_FILES)
447
448         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
449                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
450                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
451                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
452
453                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
454                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
455                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
456
457                 add_custom_command(
458                         OUTPUT ${MO_FILE_PATH}
459                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
460                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
461                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
462                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
463                         )
464
465                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
466         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
467
468         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
469 endif(USE_GETTEXT)
470
471 # Subdirectories
472
473 if (JTHREAD_FOUND)
474 else (JTHREAD_FOUND)
475         add_subdirectory(jthread)
476 endif (JTHREAD_FOUND)
477
478 if (SQLITE3_FOUND)
479 else (SQLITE3_FOUND)
480         add_subdirectory(sqlite)
481 endif (SQLITE3_FOUND)
482
483 if (LUA_FOUND)
484 else (LUA_FOUND)
485         add_subdirectory(lua)
486 endif (LUA_FOUND)
487
488 #end