]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
Update ContentFeatures serialization format now as PROTOCOL_VERSION was changed
[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         rollback_interface.cpp
157         rollback.cpp
158         genericobject.cpp
159         voxelalgorithms.cpp
160         sound.cpp
161         quicktune.cpp
162         subgame.cpp
163         inventorymanager.cpp
164         mods.cpp
165         content_abm.cpp
166         craftdef.cpp
167         nameidmapping.cpp
168         itemdef.cpp
169         nodedef.cpp
170         object_properties.cpp
171         scriptapi.cpp
172         script.cpp
173         log.cpp
174         content_sao.cpp
175         mapgen.cpp
176         content_nodemeta.cpp
177         content_mapnode.cpp
178         collision.cpp
179         nodemetadata.cpp
180         nodetimer.cpp
181         serverobject.cpp
182         noise.cpp
183         porting.cpp
184         tool.cpp
185         defaultsettings.cpp
186         mapnode.cpp
187         voxel.cpp
188         inventory.cpp
189         debug.cpp
190         serialization.cpp
191         light.cpp
192         filesys.cpp
193         connection.cpp
194         environment.cpp
195         server.cpp
196         socket.cpp
197         mapblock.cpp
198         mapsector.cpp
199         map.cpp
200         player.cpp
201         test.cpp
202         sha1.cpp
203         base64.cpp
204         ban.cpp
205         util/serialize.cpp
206         util/directiontables.cpp
207         util/numeric.cpp
208         util/pointedthing.cpp
209         util/string.cpp
210         util/timetaker.cpp
211 )
212
213 # This gives us the icon
214 if(WIN32)
215         set(WINRESOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc)
216         if(MINGW)
217                 if(NOT CMAKE_RC_COMPILER)
218                         set(CMAKE_RC_COMPILER "windres.exe")
219                 endif()
220                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
221                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR}
222                         -i${WINRESOURCE_FILE}
223                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
224                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
225                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
226         else(MINGW) # Probably MSVC
227                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
228         endif(MINGW)
229 endif()
230
231 # Client sources
232 set(minetest_SRCS
233         ${common_SRCS}
234         ${sound_SRCS}
235         localplayer.cpp
236         sky.cpp
237         clientmap.cpp
238         content_cso.cpp
239         content_mapblock.cpp
240         content_cao.cpp
241         mesh.cpp
242         mapblock_mesh.cpp
243         farmesh.cpp
244         keycode.cpp
245         camera.cpp
246         clouds.cpp
247         clientobject.cpp
248         chat.cpp
249         guiMainMenu.cpp
250         guiKeyChangeMenu.cpp
251         guiMessageMenu.cpp
252         guiTextInputMenu.cpp
253         guiFormSpecMenu.cpp
254         guiPauseMenu.cpp
255         guiPasswordChange.cpp
256         guiDeathScreen.cpp
257         guiChatConsole.cpp
258         guiCreateWorld.cpp
259         guiConfirmMenu.cpp
260         client.cpp
261         filecache.cpp
262         tile.cpp
263         game.cpp
264         main.cpp
265 )
266
267 # Server sources
268 set(minetestserver_SRCS
269         ${common_SRCS}
270         main.cpp
271 )
272
273 include_directories(
274         ${PROJECT_BINARY_DIR}
275         ${IRRLICHT_INCLUDE_DIR}
276         ${ZLIB_INCLUDE_DIR}
277         ${CMAKE_BUILD_TYPE}
278         ${PNG_INCLUDE_DIR}
279         ${GETTEXT_INCLUDE_DIR}
280         ${SOUND_INCLUDE_DIRS}
281         ${JTHREAD_INCLUDE_DIR}
282         ${SQLITE3_INCLUDE_DIR}
283         ${LUA_INCLUDE_DIR}
284 )
285
286 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
287
288 if(BUILD_CLIENT)
289         add_executable(${PROJECT_NAME} ${minetest_SRCS})
290         target_link_libraries(
291                 ${PROJECT_NAME}
292                 ${ZLIB_LIBRARIES}
293                 ${IRRLICHT_LIBRARY}
294                 ${OPENGL_LIBRARIES}
295                 ${JPEG_LIBRARIES}
296                 ${BZIP2_LIBRARIES}
297                 ${PNG_LIBRARIES}
298                 ${X11_LIBRARIES}
299                 ${GETTEXT_LIBRARY}
300                 ${SOUND_LIBRARIES}
301                 ${JTHREAD_LIBRARY}
302                 ${SQLITE3_LIBRARY}
303                 ${LUA_LIBRARY}
304                 ${PLATFORM_LIBS}
305                 ${CLIENT_PLATFORM_LIBS}
306         )
307 endif(BUILD_CLIENT)
308
309 if(BUILD_SERVER)
310         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
311         target_link_libraries(
312                 ${PROJECT_NAME}server
313                 ${ZLIB_LIBRARIES}
314                 ${JTHREAD_LIBRARY}
315                 ${SQLITE3_LIBRARY}
316                 ${LUA_LIBRARY}
317                 ${PLATFORM_LIBS}
318         )
319 endif(BUILD_SERVER)
320
321 #
322 # Set some optimizations and tweaks
323 #
324
325 include(CheckCXXCompilerFlag)
326
327 if(MSVC)
328         # Visual Studio
329
330         # EHa enables SEH exceptions (used for catching segfaults)
331         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")
332         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
333         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
334
335         # Debug build doesn't catch exceptions by itself
336         # Add some optimizations because otherwise it's VERY slow
337         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
338
339         # Flags for C files (sqlite)
340         # /MT = Link statically with standard library stuff
341         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
342         
343         if(BUILD_SERVER)
344                 set_target_properties(${PROJECT_NAME}server PROPERTIES
345                                 COMPILE_DEFINITIONS "SERVER")
346         endif(BUILD_SERVER)
347
348 else()
349         # Probably GCC
350         
351         if(WARN_ALL)
352                 set(RELEASE_WARNING_FLAGS "-Wall")
353         else()
354                 set(RELEASE_WARNING_FLAGS "")
355         endif()
356         
357         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
358                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
359                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
360                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
361                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
362         endif()
363
364         if(MINGW)
365                 set(OTHER_FLAGS "-mthreads -fexceptions")
366         endif()
367
368         if(APPLE)
369                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
370                 set(ARCH i386)
371         endif()
372
373         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
374         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}")
375
376         if(USE_GPROF)
377                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
378         endif()
379         
380         if(BUILD_SERVER)
381                 set_target_properties(${PROJECT_NAME}server PROPERTIES
382                                 COMPILE_DEFINITIONS "SERVER")
383         endif(BUILD_SERVER)
384
385 endif()
386
387 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
388 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
389
390 #
391 # Installation
392 #
393 if(WIN32)
394         if(MINGWM10_DLL)
395                 install(FILES ${MINGWM10_DLL} DESTINATION ${BINDIR})
396         endif()
397         if(DEFINED ZLIB_DLL)
398                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
399         endif()
400         if(USE_SOUND)
401                 if(OPENAL_DLL)
402                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
403                 endif()
404                 if(OGG_DLL)
405                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
406                 endif()
407                 if(VORBIS_DLL)
408                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
409                 endif()
410                 if(VORBISFILE_DLL)
411                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
412                 endif()
413         endif()
414 endif()
415
416 if(BUILD_CLIENT)
417         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
418
419         if(USE_GETTEXT)
420                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
421                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
422                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
423                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
424                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
425         endif()
426
427         if(WIN32)
428                 if(DEFINED IRRLICHT_DLL)
429                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
430                 endif()
431                 if(USE_GETTEXT)
432                         if(DEFINED GETTEXT_DLL)
433                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
434                         endif()
435                         if(DEFINED GETTEXT_ICONV_DLL)
436                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
437                         endif()
438                 endif(USE_GETTEXT)
439         endif()
440 endif(BUILD_CLIENT)
441
442 if(BUILD_SERVER)
443         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
444 endif(BUILD_SERVER)
445
446 if (USE_GETTEXT)
447         set(MO_FILES)
448
449         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
450                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
451                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
452                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
453
454                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
455                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
456                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
457
458                 add_custom_command(
459                         OUTPUT ${MO_FILE_PATH}
460                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
461                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
462                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
463                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
464                         )
465
466                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
467         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
468
469         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
470 endif(USE_GETTEXT)
471
472 # Subdirectories
473
474 if (JTHREAD_FOUND)
475 else (JTHREAD_FOUND)
476         add_subdirectory(jthread)
477 endif (JTHREAD_FOUND)
478
479 if (SQLITE3_FOUND)
480 else (SQLITE3_FOUND)
481         add_subdirectory(sqlite)
482 endif (SQLITE3_FOUND)
483
484 if (LUA_FOUND)
485 else (LUA_FOUND)
486         add_subdirectory(lua)
487 endif (LUA_FOUND)
488
489 #end