24f682f3f5dc5c97289f41eaa4d559cc751d5749
[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         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         game.cpp
284         main.cpp
285 )
286
287 # Server sources
288 set(minetestserver_SRCS
289         ${common_SRCS}
290         main.cpp
291 )
292
293 include_directories(
294         ${PROJECT_BINARY_DIR}
295         ${IRRLICHT_INCLUDE_DIR}
296         ${ZLIB_INCLUDE_DIR}
297         ${CMAKE_BUILD_TYPE}
298         ${PNG_INCLUDE_DIR}
299         ${GETTEXT_INCLUDE_DIR}
300         ${SOUND_INCLUDE_DIRS}
301         ${JTHREAD_INCLUDE_DIR}
302         ${SQLITE3_INCLUDE_DIR}
303         ${LUA_INCLUDE_DIR}
304 )
305
306 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
307
308 if(BUILD_CLIENT)
309         add_executable(${PROJECT_NAME} ${minetest_SRCS})
310         target_link_libraries(
311                 ${PROJECT_NAME}
312                 ${ZLIB_LIBRARIES}
313                 ${IRRLICHT_LIBRARY}
314                 ${OPENGL_LIBRARIES}
315                 ${JPEG_LIBRARIES}
316                 ${BZIP2_LIBRARIES}
317                 ${PNG_LIBRARIES}
318                 ${X11_LIBRARIES}
319                 ${GETTEXT_LIBRARY}
320                 ${SOUND_LIBRARIES}
321                 ${JTHREAD_LIBRARY}
322                 ${SQLITE3_LIBRARY}
323                 ${LUA_LIBRARY}
324                 ${PLATFORM_LIBS}
325                 ${CLIENT_PLATFORM_LIBS}
326         )
327
328         if(USE_CURL)
329                 target_link_libraries(
330                         ${PROJECT_NAME}
331                         ${CURL_LIBRARY}
332                 )
333                 include_directories(
334                         ${CURL_INCLUDE_DIR}
335                 )
336         endif(USE_CURL)
337 endif(BUILD_CLIENT)
338
339 if(BUILD_SERVER)
340         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
341         target_link_libraries(
342                 ${PROJECT_NAME}server
343                 ${ZLIB_LIBRARIES}
344                 ${JTHREAD_LIBRARY}
345                 ${SQLITE3_LIBRARY}
346                 ${LUA_LIBRARY}
347                 ${PLATFORM_LIBS}
348         )
349 endif(BUILD_SERVER)
350
351 #
352 # Set some optimizations and tweaks
353 #
354
355 include(CheckCXXCompilerFlag)
356
357 if(MSVC)
358         # Visual Studio
359
360         # EHa enables SEH exceptions (used for catching segfaults)
361         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")
362         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
363         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
364
365         # Debug build doesn't catch exceptions by itself
366         # Add some optimizations because otherwise it's VERY slow
367         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
368
369         # Flags for C files (sqlite)
370         # /MT = Link statically with standard library stuff
371         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
372         
373         if(BUILD_SERVER)
374                 set_target_properties(${PROJECT_NAME}server PROPERTIES
375                                 COMPILE_DEFINITIONS "SERVER")
376         endif(BUILD_SERVER)
377
378 else()
379         # Probably GCC
380         
381         if(WARN_ALL)
382                 set(RELEASE_WARNING_FLAGS "-Wall")
383         else()
384                 set(RELEASE_WARNING_FLAGS "")
385         endif()
386         
387         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
388                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
389                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
390                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
391                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
392         endif()
393
394         if(MINGW)
395                 set(OTHER_FLAGS "-mthreads -fexceptions")
396         endif()
397
398         if(APPLE)
399                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
400                 set(ARCH i386)
401         endif()
402
403         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
404         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}")
405
406         if(USE_GPROF)
407                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
408         endif()
409         
410         if(BUILD_SERVER)
411                 set_target_properties(${PROJECT_NAME}server PROPERTIES
412                                 COMPILE_DEFINITIONS "SERVER")
413         endif(BUILD_SERVER)
414
415 endif()
416
417 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
418 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
419
420 #
421 # Installation
422 #
423 if(WIN32)
424         if(MINGWM10_DLL)
425                 install(FILES ${MINGWM10_DLL} DESTINATION ${BINDIR})
426         endif()
427         if(DEFINED ZLIB_DLL)
428                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
429         endif()
430         if(USE_SOUND)
431                 if(OPENAL_DLL)
432                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
433                 endif()
434                 if(OGG_DLL)
435                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
436                 endif()
437                 if(VORBIS_DLL)
438                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
439                 endif()
440                 if(VORBISFILE_DLL)
441                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
442                 endif()
443                 if(CURL_DLL)
444                         install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
445                 endif()
446         endif()
447 endif()
448
449 if(BUILD_CLIENT)
450         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
451
452         if(USE_GETTEXT)
453                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
454                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
455                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
456                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
457                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
458         endif()
459
460         if(WIN32)
461                 if(DEFINED IRRLICHT_DLL)
462                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
463                 endif()
464                 if(USE_GETTEXT)
465                         if(DEFINED GETTEXT_DLL)
466                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
467                         endif()
468                         if(DEFINED GETTEXT_ICONV_DLL)
469                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
470                         endif()
471                 endif(USE_GETTEXT)
472         endif()
473 endif(BUILD_CLIENT)
474
475 if(BUILD_SERVER)
476         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
477 endif(BUILD_SERVER)
478
479 if (USE_GETTEXT)
480         set(MO_FILES)
481
482         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
483                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
484                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
485                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
486
487                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
488                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
489                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
490
491                 add_custom_command(
492                         OUTPUT ${MO_FILE_PATH}
493                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
494                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
495                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
496                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
497                         )
498
499                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
500         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
501
502         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
503 endif(USE_GETTEXT)
504
505 # Subdirectories
506
507 if (JTHREAD_FOUND)
508 else (JTHREAD_FOUND)
509         add_subdirectory(jthread)
510 endif (JTHREAD_FOUND)
511
512 if (SQLITE3_FOUND)
513 else (SQLITE3_FOUND)
514         add_subdirectory(sqlite)
515 endif (SQLITE3_FOUND)
516
517 if (LUA_FOUND)
518 else (LUA_FOUND)
519         add_subdirectory(lua)
520 endif (LUA_FOUND)
521
522 #end