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