]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
Initially split utility.h to multiple files in util/
[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. (-DENABLE_SOUND=0)")
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         set(MINGWM10_DLL ""
110                         CACHE FILEPATH "Path to mingwm10.dll (for installation)")
111         if(ENABLE_SOUND)
112                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
113                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
114                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
115                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
116         endif()
117 else()
118         # Unix probably
119         if(BUILD_CLIENT)
120                 find_package(X11 REQUIRED)
121                 find_package(OpenGL REQUIRED)
122                 find_package(JPEG REQUIRED)
123                 find_package(BZip2 REQUIRED)
124                 find_package(PNG REQUIRED)
125                 if(APPLE)
126                         FIND_LIBRARY(CARBON_LIB Carbon)
127                         FIND_LIBRARY(COCOA_LIB Cocoa)
128                         FIND_LIBRARY(IOKIT_LIB IOKit)
129                         mark_as_advanced(
130                                 CARBON_LIB
131                                 COCOA_LIB
132                                 IOKIT_LIB
133                         )
134                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
135                 endif(APPLE)
136         endif(BUILD_CLIENT)
137         find_package(ZLIB REQUIRED)
138         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
139         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
140         # This way Xxf86vm is found on OpenBSD too
141         find_library(XXF86VM_LIBRARY Xxf86vm)
142         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
143 endif()
144
145 find_package(Jthread REQUIRED)
146 find_package(Sqlite3 REQUIRED)
147
148 # TODO: Create proper find script for Lua
149 set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
150 set(LUA_LIBRARY "lua")
151
152 configure_file(
153         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
154         "${PROJECT_BINARY_DIR}/cmake_config.h"
155 )
156
157 set(common_SRCS
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         servercommand.cpp
197         socket.cpp
198         mapblock.cpp
199         mapsector.cpp
200         map.cpp
201         player.cpp
202         utility.cpp
203         test.cpp
204         sha1.cpp
205         base64.cpp
206         ban.cpp
207         util/serialize.cpp
208         util/directiontables.cpp
209         util/numeric.cpp
210         util/pointedthing.cpp
211         util/string.cpp
212         util/timetaker.cpp
213 )
214
215 # This gives us the icon
216 if(WIN32)
217         set(WINRESOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc)
218         if(MINGW)
219                 if(NOT CMAKE_RC_COMPILER)
220                         set(CMAKE_RC_COMPILER "windres.exe")
221                 endif()
222                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
223                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR}
224                         -i${WINRESOURCE_FILE}
225                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
226                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
227                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
228         else(MINGW) # Probably MSVC
229                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
230         endif(MINGW)
231 endif()
232
233 # Client sources
234 set(minetest_SRCS
235         ${common_SRCS}
236         ${sound_SRCS}
237         localplayer.cpp
238         sky.cpp
239         clientmap.cpp
240         content_cso.cpp
241         content_mapblock.cpp
242         content_cao.cpp
243         mesh.cpp
244         mapblock_mesh.cpp
245         farmesh.cpp
246         keycode.cpp
247         camera.cpp
248         clouds.cpp
249         clientobject.cpp
250         chat.cpp
251         guiMainMenu.cpp
252         guiKeyChangeMenu.cpp
253         guiMessageMenu.cpp
254         guiTextInputMenu.cpp
255         guiInventoryMenu.cpp
256         guiPauseMenu.cpp
257         guiPasswordChange.cpp
258         guiDeathScreen.cpp
259         guiChatConsole.cpp
260         guiCreateWorld.cpp
261         guiConfirmMenu.cpp
262         client.cpp
263         filecache.cpp
264         tile.cpp
265         game.cpp
266         main.cpp
267 )
268
269 # Server sources
270 set(minetestserver_SRCS
271         ${common_SRCS}
272         main.cpp
273 )
274
275 include_directories(
276         ${PROJECT_BINARY_DIR}
277         ${IRRLICHT_INCLUDE_DIR}
278         ${ZLIB_INCLUDE_DIR}
279         ${CMAKE_BUILD_TYPE}
280         ${PNG_INCLUDE_DIR}
281         ${GETTEXT_INCLUDE_DIR}
282         ${SOUND_INCLUDE_DIRS}
283         ${JTHREAD_INCLUDE_DIR}
284         ${SQLITE3_INCLUDE_DIR}
285         ${LUA_INCLUDE_DIR}
286 )
287
288 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
289
290 if(BUILD_CLIENT)
291         add_executable(${PROJECT_NAME} ${minetest_SRCS})
292         target_link_libraries(
293                 ${PROJECT_NAME}
294                 ${ZLIB_LIBRARIES}
295                 ${IRRLICHT_LIBRARY}
296                 ${OPENGL_LIBRARIES}
297                 ${JPEG_LIBRARIES}
298                 ${BZIP2_LIBRARIES}
299                 ${PNG_LIBRARIES}
300                 ${X11_LIBRARIES}
301                 ${GETTEXT_LIBRARY}
302                 ${SOUND_LIBRARIES}
303                 ${JTHREAD_LIBRARY}
304                 ${SQLITE3_LIBRARY}
305                 ${LUA_LIBRARY}
306                 ${PLATFORM_LIBS}
307                 ${CLIENT_PLATFORM_LIBS}
308         )
309 endif(BUILD_CLIENT)
310
311 if(BUILD_SERVER)
312         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
313         target_link_libraries(
314                 ${PROJECT_NAME}server
315                 ${ZLIB_LIBRARIES}
316                 ${JTHREAD_LIBRARY}
317                 ${SQLITE3_LIBRARY}
318                 ${LUA_LIBRARY}
319                 ${PLATFORM_LIBS}
320         )
321 endif(BUILD_SERVER)
322
323 #
324 # Set some optimizations and tweaks
325 #
326
327 include(CheckCXXCompilerFlag)
328
329 if(MSVC)
330         # Visual Studio
331
332         # EHa enables SEH exceptions (used for catching segfaults)
333         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")
334         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
335         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
336
337         # Debug build doesn't catch exceptions by itself
338         # Add some optimizations because otherwise it's VERY slow
339         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
340
341         # Flags for C files (sqlite)
342         # /MT = Link statically with standard library stuff
343         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
344         
345         if(BUILD_SERVER)
346                 set_target_properties(${PROJECT_NAME}server PROPERTIES
347                                 COMPILE_DEFINITIONS "SERVER")
348         endif(BUILD_SERVER)
349
350 else()
351         # Probably GCC
352         
353         if(WARN_ALL)
354                 set(RELEASE_WARNING_FLAGS "-Wall")
355         else()
356                 set(RELEASE_WARNING_FLAGS "")
357         endif()
358         
359         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
360                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
361                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
362                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
363                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
364         endif()
365
366         if(MINGW)
367                 set(OTHER_FLAGS "-mthreads -fexceptions")
368         endif()
369
370         if(APPLE)
371                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
372                 set(ARCH i386)
373         endif()
374
375         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
376         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}")
377
378         if(USE_GPROF)
379                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
380         endif()
381         
382         if(BUILD_SERVER)
383                 set_target_properties(${PROJECT_NAME}server PROPERTIES
384                                 COMPILE_DEFINITIONS "SERVER")
385         endif(BUILD_SERVER)
386
387 endif()
388
389 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
390 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
391
392 #
393 # Installation
394 #
395 if(WIN32)
396         if(MINGWM10_DLL)
397                 install(FILES ${MINGWM10_DLL} DESTINATION ${BINDIR})
398         endif()
399         if(DEFINED ZLIB_DLL)
400                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
401         endif()
402         if(USE_SOUND)
403                 if(OPENAL_DLL)
404                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
405                 endif()
406                 if(OGG_DLL)
407                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
408                 endif()
409                 if(VORBIS_DLL)
410                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
411                 endif()
412                 if(VORBISFILE_DLL)
413                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
414                 endif()
415         endif()
416 endif()
417
418 if(BUILD_CLIENT)
419         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
420
421         if(USE_GETTEXT)
422                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
423                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
424                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
425                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
426                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
427         endif()
428
429         if(WIN32)
430                 if(DEFINED IRRLICHT_DLL)
431                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
432                 endif()
433                 if(USE_GETTEXT)
434                         if(DEFINED GETTEXT_DLL)
435                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
436                         endif()
437                         if(DEFINED GETTEXT_ICONV_DLL)
438                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
439                         endif()
440                 endif(USE_GETTEXT)
441         endif()
442 endif(BUILD_CLIENT)
443
444 if(BUILD_SERVER)
445         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
446 endif(BUILD_SERVER)
447
448 if (USE_GETTEXT)
449         set(MO_FILES)
450
451         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
452                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
453                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
454                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
455
456                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
457                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
458                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
459
460                 add_custom_command(
461                         OUTPUT ${MO_FILE_PATH}
462                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
463                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
464                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
465                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
466                         )
467
468                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
469         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
470
471         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
472 endif(USE_GETTEXT)
473
474 # Subdirectories
475
476 if (JTHREAD_FOUND)
477 else (JTHREAD_FOUND)
478         add_subdirectory(jthread)
479 endif (JTHREAD_FOUND)
480
481 if (SQLITE3_FOUND)
482 else (SQLITE3_FOUND)
483         add_subdirectory(sqlite)
484 endif (SQLITE3_FOUND)
485
486 if (LUA_FOUND)
487 else (LUA_FOUND)
488         add_subdirectory(lua)
489 endif (LUA_FOUND)
490
491 #end