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