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