]> git.lizzy.rs Git - dragonfireclient.git/blob - src/CMakeLists.txt
Smooth day-night transitions
[dragonfireclient.git] / src / CMakeLists.txt
1 project(minetest)
2 cmake_minimum_required( VERSION 2.6 )
3
4 # Set some random things default to not being visible in the GUI
5 mark_as_advanced(EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH)
6 mark_as_advanced(JTHREAD_INCLUDE_DIR JTHREAD_LIBRARY)
7 mark_as_advanced(SQLITE3_INCLUDE_DIR SQLITE3_LIBRARY)
8
9 # user-visible option to enable/disable gettext usage
10 OPTION(ENABLE_GETTEXT "Use GetText for internationalization" 0)
11
12 # this is only set to 1 if gettext is enabled _and_ available
13 set(USE_GETTEXT 0)
14
15 if(ENABLE_GETTEXT)
16         find_package(GettextLib)
17 else()
18         MARK_AS_ADVANCED(GETTEXT_ICONV_DLL GETTEXT_INCLUDE_DIR GETTEXT_LIBRARY GETTEXT_MSGFMT)
19 endif()
20
21 if(GETTEXT_FOUND AND ENABLE_GETTEXT)
22         message(STATUS "gettext include path: ${GETTEXT_INCLUDE_DIR}")
23         message(STATUS "gettext msgfmt path: ${GETTEXT_MSGFMT}")
24         if(WIN32)
25                 message(STATUS "gettext library: ${GETTEXT_LIBRARY}")
26                 message(STATUS "gettext dll: ${GETTEXT_DLL}")
27                 message(STATUS "gettext iconv dll: ${GETTEXT_ICONV_DLL}")
28         endif()
29         set(USE_GETTEXT 1)
30         message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
31 elseif(GETTEXT_FOUND AND NOT ENABLE_GETTEXT)
32         MESSAGE(STATUS "GetText found but disabled;")
33 else(GETTEXT_FOUND AND ENABLE_GETTEXT)
34         message(STATUS "GetText disabled")
35 endif(GETTEXT_FOUND AND ENABLE_GETTEXT)
36
37 # user visible option to enable/disable sound
38 OPTION(ENABLE_SOUND "Enable sound" ON)
39
40 # this is only set to 1 if sound is enabled _and_ available
41 set(USE_SOUND 0)
42 set(SOUND_PROBLEM 0)
43
44 if(ENABLE_SOUND AND BUILD_CLIENT)
45         # Sound libraries
46         find_package(OpenAL)
47         find_package(Vorbis)
48         if(NOT OPENAL_FOUND)
49                 message(STATUS "Sound enabled, but OpenAL not found!")
50                 set(SOUND_PROBLEM 1)
51                 MARK_AS_ADVANCED(CLEAR OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
52         endif()
53         if(NOT VORBIS_FOUND)
54                 message(STATUS "Sound enabled, but Vorbis libraries not found!")
55                 set(SOUND_PROBLEM 1)
56                 MARK_AS_ADVANCED(CLEAR OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)
57         endif()
58         if(OPENAL_FOUND AND VORBIS_FOUND)
59                 set(USE_SOUND 1)
60                 message(STATUS "Sound enabled")
61         endif()
62 endif(ENABLE_SOUND AND BUILD_CLIENT)
63
64 if(SOUND_PROBLEM)
65         message(FATAL_ERROR "Sound enabled, but cannot be used.\n"
66                 "To continue, either fill in the required paths or disable sound. (-DENABLE_SOUND=0)")
67 endif()
68 if(USE_SOUND)
69         set(sound_SRCS sound_openal.cpp)
70         set(SOUND_INCLUDE_DIRS
71                 ${OPENAL_INCLUDE_DIR}
72                 ${VORBIS_INCLUDE_DIR}
73                 ${OGG_INCLUDE_DIR}
74                 )
75         set(SOUND_LIBRARIES
76                 ${OPENAL_LIBRARY}
77                 ${VORBIS_LIBRARIES}
78                 )
79 endif()
80
81 if(NOT MSVC)
82         set(USE_GPROF 0 CACHE BOOL "Use -pg flag for g++")
83 endif()
84
85 # Use cmake_config.h
86 add_definitions ( -DUSE_CMAKE_CONFIG_H )
87
88 if(WIN32)
89         # Windows
90         if(MSVC) # MSVC Specifics
91                 # Surpress some useless warnings
92                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
93         else() # Probably MinGW = GCC
94                 set(PLATFORM_LIBS ws2_32.lib)
95         endif()
96         # Zlib stuff
97         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
98                         CACHE PATH "Zlib include directory")
99         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
100                         CACHE FILEPATH "Path to zlibwapi.lib")
101         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
102                         CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
103         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
104                         CACHE PATH "irrlicht dir")
105         set(MINGWM10_DLL ""
106                         CACHE FILEPATH "Path to mingwm10.dll (for installation)")
107         if(ENABLE_SOUND)
108                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
109                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
110                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
111                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
112         endif()
113 else()
114         # Unix probably
115         if(BUILD_CLIENT)
116                 find_package(X11 REQUIRED)
117                 find_package(OpenGL REQUIRED)
118                 find_package(JPEG REQUIRED)
119                 find_package(BZip2 REQUIRED)
120                 find_package(PNG REQUIRED)
121                 if(APPLE)
122                         FIND_LIBRARY(CARBON_LIB Carbon)
123                         FIND_LIBRARY(COCOA_LIB Cocoa)
124                         FIND_LIBRARY(IOKIT_LIB IOKit)
125                         mark_as_advanced(
126                                 CARBON_LIB
127                                 COCOA_LIB
128                                 IOKIT_LIB
129                         )
130                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
131                 endif(APPLE)
132         endif(BUILD_CLIENT)
133         find_package(ZLIB REQUIRED)
134         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
135         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
136         # This way Xxf86vm is found on OpenBSD too
137         find_library(XXF86VM_LIBRARY Xxf86vm)
138         mark_as_advanced(XXF86VM_LIBRARY)
139         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
140 endif()
141
142 find_package(Jthread REQUIRED)
143 find_package(Sqlite3 REQUIRED)
144
145 # Do not use system-wide installation of Lua, because it'll likely be a
146 # different version and/or has different build options.
147 set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
148 set(LUA_LIBRARY "lua")
149
150 configure_file(
151         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
152         "${PROJECT_BINARY_DIR}/cmake_config.h"
153 )
154
155 set(common_SRCS
156         rollback_interface.cpp
157         rollback.cpp
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         socket.cpp
197         mapblock.cpp
198         mapsector.cpp
199         map.cpp
200         player.cpp
201         test.cpp
202         sha1.cpp
203         base64.cpp
204         ban.cpp
205         clientserver.cpp
206         staticobject.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         guiFormSpecMenu.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         shader.cpp
266         game.cpp
267         main.cpp
268 )
269
270 # Server sources
271 set(minetestserver_SRCS
272         ${common_SRCS}
273         main.cpp
274 )
275
276 include_directories(
277         ${PROJECT_BINARY_DIR}
278         ${IRRLICHT_INCLUDE_DIR}
279         ${ZLIB_INCLUDE_DIR}
280         ${CMAKE_BUILD_TYPE}
281         ${PNG_INCLUDE_DIR}
282         ${GETTEXT_INCLUDE_DIR}
283         ${SOUND_INCLUDE_DIRS}
284         ${JTHREAD_INCLUDE_DIR}
285         ${SQLITE3_INCLUDE_DIR}
286         ${LUA_INCLUDE_DIR}
287 )
288
289 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
290
291 if(BUILD_CLIENT)
292         add_executable(${PROJECT_NAME} ${minetest_SRCS})
293         target_link_libraries(
294                 ${PROJECT_NAME}
295                 ${ZLIB_LIBRARIES}
296                 ${IRRLICHT_LIBRARY}
297                 ${OPENGL_LIBRARIES}
298                 ${JPEG_LIBRARIES}
299                 ${BZIP2_LIBRARIES}
300                 ${PNG_LIBRARIES}
301                 ${X11_LIBRARIES}
302                 ${GETTEXT_LIBRARY}
303                 ${SOUND_LIBRARIES}
304                 ${JTHREAD_LIBRARY}
305                 ${SQLITE3_LIBRARY}
306                 ${LUA_LIBRARY}
307                 ${PLATFORM_LIBS}
308                 ${CLIENT_PLATFORM_LIBS}
309         )
310 endif(BUILD_CLIENT)
311
312 if(BUILD_SERVER)
313         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
314         target_link_libraries(
315                 ${PROJECT_NAME}server
316                 ${ZLIB_LIBRARIES}
317                 ${JTHREAD_LIBRARY}
318                 ${SQLITE3_LIBRARY}
319                 ${LUA_LIBRARY}
320                 ${PLATFORM_LIBS}
321         )
322 endif(BUILD_SERVER)
323
324 #
325 # Set some optimizations and tweaks
326 #
327
328 include(CheckCXXCompilerFlag)
329
330 if(MSVC)
331         # Visual Studio
332
333         # EHa enables SEH exceptions (used for catching segfaults)
334         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")
335         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
336         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
337
338         # Debug build doesn't catch exceptions by itself
339         # Add some optimizations because otherwise it's VERY slow
340         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
341
342         # Flags for C files (sqlite)
343         # /MT = Link statically with standard library stuff
344         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
345         
346         if(BUILD_SERVER)
347                 set_target_properties(${PROJECT_NAME}server PROPERTIES
348                                 COMPILE_DEFINITIONS "SERVER")
349         endif(BUILD_SERVER)
350
351 else()
352         # Probably GCC
353         
354         if(WARN_ALL)
355                 set(RELEASE_WARNING_FLAGS "-Wall")
356         else()
357                 set(RELEASE_WARNING_FLAGS "")
358         endif()
359         
360         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
361                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
362                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
363                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
364                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
365         endif()
366
367         if(MINGW)
368                 set(OTHER_FLAGS "-mthreads -fexceptions")
369         endif()
370
371         if(APPLE)
372                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
373                 set(ARCH i386)
374         endif()
375
376         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
377         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}")
378
379         if(USE_GPROF)
380                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
381         endif()
382         
383         if(BUILD_SERVER)
384                 set_target_properties(${PROJECT_NAME}server PROPERTIES
385                                 COMPILE_DEFINITIONS "SERVER")
386         endif(BUILD_SERVER)
387
388 endif()
389
390 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
391 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
392
393 #
394 # Installation
395 #
396 if(WIN32)
397         if(MINGWM10_DLL)
398                 install(FILES ${MINGWM10_DLL} DESTINATION ${BINDIR})
399         endif()
400         if(DEFINED ZLIB_DLL)
401                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
402         endif()
403         if(USE_SOUND)
404                 if(OPENAL_DLL)
405                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
406                 endif()
407                 if(OGG_DLL)
408                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
409                 endif()
410                 if(VORBIS_DLL)
411                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
412                 endif()
413                 if(VORBISFILE_DLL)
414                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
415                 endif()
416         endif()
417 endif()
418
419 if(BUILD_CLIENT)
420         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
421
422         if(USE_GETTEXT)
423                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
424                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
425                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
426                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
427                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
428         endif()
429
430         if(WIN32)
431                 if(DEFINED IRRLICHT_DLL)
432                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
433                 endif()
434                 if(USE_GETTEXT)
435                         if(DEFINED GETTEXT_DLL)
436                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
437                         endif()
438                         if(DEFINED GETTEXT_ICONV_DLL)
439                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
440                         endif()
441                 endif(USE_GETTEXT)
442         endif()
443 endif(BUILD_CLIENT)
444
445 if(BUILD_SERVER)
446         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
447 endif(BUILD_SERVER)
448
449 if (USE_GETTEXT)
450         set(MO_FILES)
451
452         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
453                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
454                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
455                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
456
457                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
458                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
459                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
460
461                 add_custom_command(
462                         OUTPUT ${MO_FILE_PATH}
463                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
464                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
465                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
466                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
467                         )
468
469                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
470         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
471
472         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
473 endif(USE_GETTEXT)
474
475 # Subdirectories
476
477 if (JTHREAD_FOUND)
478 else (JTHREAD_FOUND)
479         add_subdirectory(jthread)
480 endif (JTHREAD_FOUND)
481
482 if (SQLITE3_FOUND)
483 else (SQLITE3_FOUND)
484         add_subdirectory(sqlite)
485 endif (SQLITE3_FOUND)
486
487 if (LUA_FOUND)
488 else (LUA_FOUND)
489         add_subdirectory(lua)
490 endif (LUA_FOUND)
491
492 #end