]> git.lizzy.rs Git - dragonfireclient.git/blob - src/CMakeLists.txt
The new mapgen, noise functions, et al.
[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 option(ENABLE_CURL "Enable cURL support for fetching media" 1)
10
11 if (NOT ENABLE_CURL)
12         mark_as_advanced(CLEAR CURL_LIBRARY CURL_INCLUDE_DIR)
13 endif(NOT ENABLE_CURL)
14
15 if( ENABLE_CURL )
16         find_package(CURL)
17 endif( ENABLE_CURL )
18 set(USE_CURL 0)
19 if (CURL_FOUND AND ENABLE_CURL)
20         message(STATUS "cURL support enabled")
21         set(USE_CURL 1)
22 endif(CURL_FOUND AND ENABLE_CURL)
23
24 # user-visible option to enable/disable gettext usage
25 OPTION(ENABLE_GETTEXT "Use GetText for internationalization" 0)
26
27 # this is only set to 1 if gettext is enabled _and_ available
28 set(USE_GETTEXT 0)
29
30 if(ENABLE_GETTEXT)
31         find_package(GettextLib)
32 else()
33         MARK_AS_ADVANCED(GETTEXT_ICONV_DLL GETTEXT_INCLUDE_DIR GETTEXT_LIBRARY GETTEXT_MSGFMT)
34 endif()
35
36 if(GETTEXT_FOUND AND ENABLE_GETTEXT)
37         message(STATUS "gettext include path: ${GETTEXT_INCLUDE_DIR}")
38         message(STATUS "gettext msgfmt path: ${GETTEXT_MSGFMT}")
39         if(WIN32)
40                 message(STATUS "gettext library: ${GETTEXT_LIBRARY}")
41                 message(STATUS "gettext dll: ${GETTEXT_DLL}")
42                 message(STATUS "gettext iconv dll: ${GETTEXT_ICONV_DLL}")
43         endif()
44         set(USE_GETTEXT 1)
45         message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
46 elseif(GETTEXT_FOUND AND NOT ENABLE_GETTEXT)
47         MESSAGE(STATUS "GetText found but disabled;")
48 else(GETTEXT_FOUND AND ENABLE_GETTEXT)
49         message(STATUS "GetText disabled")
50 endif(GETTEXT_FOUND AND ENABLE_GETTEXT)
51
52 # user visible option to enable/disable sound
53 OPTION(ENABLE_SOUND "Enable sound" ON)
54
55 # this is only set to 1 if sound is enabled _and_ available
56 set(USE_SOUND 0)
57 set(SOUND_PROBLEM 0)
58
59 if(ENABLE_SOUND AND BUILD_CLIENT)
60         # Sound libraries
61         find_package(OpenAL)
62         find_package(Vorbis)
63         if(NOT OPENAL_FOUND)
64                 message(STATUS "Sound enabled, but OpenAL not found!")
65                 set(SOUND_PROBLEM 1)
66                 MARK_AS_ADVANCED(CLEAR OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
67         endif()
68         if(NOT VORBIS_FOUND)
69                 message(STATUS "Sound enabled, but Vorbis libraries not found!")
70                 set(SOUND_PROBLEM 1)
71                 MARK_AS_ADVANCED(CLEAR OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)
72         endif()
73         if(OPENAL_FOUND AND VORBIS_FOUND)
74                 set(USE_SOUND 1)
75                 message(STATUS "Sound enabled")
76         endif()
77 endif(ENABLE_SOUND AND BUILD_CLIENT)
78
79 if(SOUND_PROBLEM)
80         message(FATAL_ERROR "Sound enabled, but cannot be used.\n"
81                 "To continue, either fill in the required paths or disable sound. (-DENABLE_SOUND=0)")
82 endif()
83 if(USE_SOUND)
84         set(sound_SRCS sound_openal.cpp)
85         set(SOUND_INCLUDE_DIRS
86                 ${OPENAL_INCLUDE_DIR}
87                 ${VORBIS_INCLUDE_DIR}
88                 ${OGG_INCLUDE_DIR}
89                 )
90         set(SOUND_LIBRARIES
91                 ${OPENAL_LIBRARY}
92                 ${VORBIS_LIBRARIES}
93                 )
94 endif()
95
96 if(NOT MSVC)
97         set(USE_GPROF 0 CACHE BOOL "Use -pg flag for g++")
98 endif()
99
100 # Use cmake_config.h
101 add_definitions ( -DUSE_CMAKE_CONFIG_H )
102
103 if(WIN32)
104         # Windows
105         if(MSVC) # MSVC Specifics
106                 # Surpress some useless warnings
107                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
108         else() # Probably MinGW = GCC
109                 set(PLATFORM_LIBS ws2_32.lib)
110         endif()
111         # Zlib stuff
112         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
113                         CACHE PATH "Zlib include directory")
114         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
115                         CACHE FILEPATH "Path to zlibwapi.lib")
116         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
117                         CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
118         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
119                         CACHE PATH "irrlicht dir")
120         set(MINGWM10_DLL ""
121                         CACHE FILEPATH "Path to mingwm10.dll (for installation)")
122         if(ENABLE_SOUND)
123                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
124                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
125                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
126                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
127         endif()
128 else()
129         # Unix probably
130         if(BUILD_CLIENT)
131                 find_package(X11 REQUIRED)
132                 find_package(OpenGL REQUIRED)
133                 find_package(JPEG REQUIRED)
134                 find_package(BZip2 REQUIRED)
135                 find_package(PNG REQUIRED)
136                 if(APPLE)
137                         FIND_LIBRARY(CARBON_LIB Carbon)
138                         FIND_LIBRARY(COCOA_LIB Cocoa)
139                         FIND_LIBRARY(IOKIT_LIB IOKit)
140                         mark_as_advanced(
141                                 CARBON_LIB
142                                 COCOA_LIB
143                                 IOKIT_LIB
144                         )
145                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
146                 endif(APPLE)
147         endif(BUILD_CLIENT)
148         find_package(ZLIB REQUIRED)
149         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
150         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
151         # This way Xxf86vm is found on OpenBSD too
152         find_library(XXF86VM_LIBRARY Xxf86vm)
153         mark_as_advanced(XXF86VM_LIBRARY)
154         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
155 endif()
156
157 find_package(Jthread REQUIRED)
158 find_package(Sqlite3 REQUIRED)
159
160 # Do not use system-wide installation of Lua, because it'll likely be a
161 # different version and/or has different build options.
162 set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
163 set(LUA_LIBRARY "lua")
164
165 configure_file(
166         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
167         "${PROJECT_BINARY_DIR}/cmake_config.h"
168 )
169
170 set(common_SRCS
171         rollback_interface.cpp
172         rollback.cpp
173         genericobject.cpp
174         voxelalgorithms.cpp
175         sound.cpp
176         quicktune.cpp
177         subgame.cpp
178         inventorymanager.cpp
179         mods.cpp
180         content_abm.cpp
181         craftdef.cpp
182         nameidmapping.cpp
183         itemdef.cpp
184         nodedef.cpp
185         object_properties.cpp
186         scriptapi.cpp
187         script.cpp
188         log.cpp
189         content_sao.cpp
190         mapgen.cpp
191         treegen.cpp
192         content_nodemeta.cpp
193         content_mapnode.cpp
194         collision.cpp
195         nodemetadata.cpp
196         nodetimer.cpp
197         serverobject.cpp
198         noise.cpp
199         porting.cpp
200         tool.cpp
201         defaultsettings.cpp
202         mapnode.cpp
203         voxel.cpp
204         inventory.cpp
205         debug.cpp
206         serialization.cpp
207         light.cpp
208         filesys.cpp
209         connection.cpp
210         environment.cpp
211         server.cpp
212         socket.cpp
213         mapblock.cpp
214         mapsector.cpp
215         map.cpp
216         player.cpp
217         test.cpp
218         sha1.cpp
219         base64.cpp
220         ban.cpp
221         biome.cpp
222         clientserver.cpp
223         staticobject.cpp
224         util/serialize.cpp
225         util/directiontables.cpp
226         util/numeric.cpp
227         util/pointedthing.cpp
228         util/string.cpp
229         util/timetaker.cpp
230 )
231
232 # This gives us the icon
233 if(WIN32)
234         set(WINRESOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc)
235         if(MINGW)
236                 if(NOT CMAKE_RC_COMPILER)
237                         set(CMAKE_RC_COMPILER "windres.exe")
238                 endif()
239                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
240                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR}
241                         -i${WINRESOURCE_FILE}
242                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
243                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
244                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
245         else(MINGW) # Probably MSVC
246                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
247         endif(MINGW)
248 endif()
249
250 # Client sources
251 set(minetest_SRCS
252         ${common_SRCS}
253         ${sound_SRCS}
254         localplayer.cpp
255         sky.cpp
256         clientmap.cpp
257         content_cso.cpp
258         content_mapblock.cpp
259         content_cao.cpp
260         mesh.cpp
261         mapblock_mesh.cpp
262         farmesh.cpp
263         keycode.cpp
264         camera.cpp
265         clouds.cpp
266         particles.cpp
267         clientobject.cpp
268         chat.cpp
269         guiMainMenu.cpp
270         guiKeyChangeMenu.cpp
271         guiMessageMenu.cpp
272         guiTextInputMenu.cpp
273         guiFormSpecMenu.cpp
274         guiPauseMenu.cpp
275         guiPasswordChange.cpp
276         guiDeathScreen.cpp
277         guiChatConsole.cpp
278         guiCreateWorld.cpp
279         guiConfigureWorld.cpp
280         guiConfirmMenu.cpp
281         client.cpp
282         filecache.cpp
283         tile.cpp
284         shader.cpp
285         serverlist.cpp
286         game.cpp
287         main.cpp
288 )
289
290 # Server sources
291 set(minetestserver_SRCS
292         ${common_SRCS}
293         main.cpp
294 )
295
296 include_directories(
297         ${PROJECT_BINARY_DIR}
298         ${IRRLICHT_INCLUDE_DIR}
299         ${ZLIB_INCLUDE_DIR}
300         ${CMAKE_BUILD_TYPE}
301         ${PNG_INCLUDE_DIR}
302         ${GETTEXT_INCLUDE_DIR}
303         ${SOUND_INCLUDE_DIRS}
304         ${JTHREAD_INCLUDE_DIR}
305         ${SQLITE3_INCLUDE_DIR}
306         ${LUA_INCLUDE_DIR}
307 )
308
309 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
310
311 if(BUILD_CLIENT)
312         add_executable(${PROJECT_NAME} ${minetest_SRCS})
313         target_link_libraries(
314                 ${PROJECT_NAME}
315                 ${ZLIB_LIBRARIES}
316                 ${IRRLICHT_LIBRARY}
317                 ${OPENGL_LIBRARIES}
318                 ${JPEG_LIBRARIES}
319                 ${BZIP2_LIBRARIES}
320                 ${PNG_LIBRARIES}
321                 ${X11_LIBRARIES}
322                 ${GETTEXT_LIBRARY}
323                 ${SOUND_LIBRARIES}
324                 ${JTHREAD_LIBRARY}
325                 ${SQLITE3_LIBRARY}
326                 ${LUA_LIBRARY}
327                 ${PLATFORM_LIBS}
328                 ${CLIENT_PLATFORM_LIBS}
329         )
330
331         if(USE_CURL)
332                 target_link_libraries(
333                         ${PROJECT_NAME}
334                         ${CURL_LIBRARY}
335                 )
336                 include_directories(
337                         ${CURL_INCLUDE_DIR}
338                 )
339         endif(USE_CURL)
340 endif(BUILD_CLIENT)
341
342 if(BUILD_SERVER)
343         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
344         target_link_libraries(
345                 ${PROJECT_NAME}server
346                 ${ZLIB_LIBRARIES}
347                 ${JTHREAD_LIBRARY}
348                 ${SQLITE3_LIBRARY}
349                 ${LUA_LIBRARY}
350                 ${PLATFORM_LIBS}
351         )
352 endif(BUILD_SERVER)
353
354 #
355 # Set some optimizations and tweaks
356 #
357
358 include(CheckCXXCompilerFlag)
359
360 if(MSVC)
361         # Visual Studio
362
363         # EHa enables SEH exceptions (used for catching segfaults)
364         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")
365         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
366         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
367
368         # Debug build doesn't catch exceptions by itself
369         # Add some optimizations because otherwise it's VERY slow
370         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
371
372         # Flags for C files (sqlite)
373         # /MT = Link statically with standard library stuff
374         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
375         
376         if(BUILD_SERVER)
377                 set_target_properties(${PROJECT_NAME}server PROPERTIES
378                                 COMPILE_DEFINITIONS "SERVER")
379         endif(BUILD_SERVER)
380
381 else()
382         # Probably GCC
383         
384         if(WARN_ALL)
385                 set(RELEASE_WARNING_FLAGS "-Wall")
386         else()
387                 set(RELEASE_WARNING_FLAGS "")
388         endif()
389         
390         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
391                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
392                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
393                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
394                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
395         endif()
396
397         if(MINGW)
398                 set(OTHER_FLAGS "-mthreads -fexceptions")
399         endif()
400
401         if(APPLE)
402                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
403                 set(ARCH i386)
404         endif()
405
406         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
407         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}")
408
409         if(USE_GPROF)
410                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
411         endif()
412         
413         if(BUILD_SERVER)
414                 set_target_properties(${PROJECT_NAME}server PROPERTIES
415                                 COMPILE_DEFINITIONS "SERVER")
416         endif(BUILD_SERVER)
417
418 endif()
419
420 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
421 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
422
423 #
424 # Installation
425 #
426 if(WIN32)
427         if(MINGWM10_DLL)
428                 install(FILES ${MINGWM10_DLL} DESTINATION ${BINDIR})
429         endif()
430         if(DEFINED ZLIB_DLL)
431                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
432         endif()
433         if(USE_SOUND)
434                 if(OPENAL_DLL)
435                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
436                 endif()
437                 if(OGG_DLL)
438                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
439                 endif()
440                 if(VORBIS_DLL)
441                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
442                 endif()
443                 if(VORBISFILE_DLL)
444                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
445                 endif()
446                 if(CURL_DLL)
447                         install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
448                 endif()
449         endif()
450 endif()
451
452 if(BUILD_CLIENT)
453         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
454
455         if(USE_GETTEXT)
456                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
457                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
458                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
459                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
460                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
461         endif()
462
463         if(WIN32)
464                 if(DEFINED IRRLICHT_DLL)
465                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
466                 endif()
467                 if(USE_GETTEXT)
468                         if(DEFINED GETTEXT_DLL)
469                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
470                         endif()
471                         if(DEFINED GETTEXT_ICONV_DLL)
472                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
473                         endif()
474                 endif(USE_GETTEXT)
475         endif()
476 endif(BUILD_CLIENT)
477
478 if(BUILD_SERVER)
479         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
480 endif(BUILD_SERVER)
481
482 if (USE_GETTEXT)
483         set(MO_FILES)
484
485         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
486                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
487                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
488                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
489
490                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
491                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
492                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
493
494                 add_custom_command(
495                         OUTPUT ${MO_FILE_PATH}
496                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
497                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
498                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
499                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
500                         )
501
502                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
503         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
504
505         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
506 endif(USE_GETTEXT)
507
508 # Subdirectories
509
510 if (JTHREAD_FOUND)
511 else (JTHREAD_FOUND)
512         add_subdirectory(jthread)
513 endif (JTHREAD_FOUND)
514
515 if (SQLITE3_FOUND)
516 else (SQLITE3_FOUND)
517         add_subdirectory(sqlite)
518 endif (SQLITE3_FOUND)
519
520 if (LUA_FOUND)
521 else (LUA_FOUND)
522         add_subdirectory(lua)
523 endif (LUA_FOUND)
524
525 #end