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