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