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