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