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