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