a0276cfaa95d53ce2aa99255aa80029a1f68e1f5
[oweals/minetest.git] / src / CMakeLists.txt
1 project(minetest)
2 cmake_minimum_required( VERSION 2.6 )
3
4 if(RUN_IN_PLACE)
5         add_definitions ( -DRUN_IN_PLACE )
6 endif(RUN_IN_PLACE)
7
8 # Set some random things default to not being visible in the GUI
9 mark_as_advanced(EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH)
10 mark_as_advanced(JTHREAD_INCLUDE_DIR JTHREAD_LIBRARY)
11 mark_as_advanced(SQLITE3_INCLUDE_DIR SQLITE3_LIBRARY)
12
13 # user-visible option to enable/disable gettext usage
14 OPTION(ENABLE_GETTEXT "Use GetText for internationalization" 0)
15
16 # this is only set to 1 if gettext is enabled _and_ available
17 set(USE_GETTEXT 0)
18
19 if(ENABLE_GETTEXT)
20         find_package(GettextLib)
21 else()
22         MARK_AS_ADVANCED(GETTEXT_ICONV_DLL GETTEXT_INCLUDE_DIR GETTEXT_LIBRARY GETTEXT_MSGFMT)
23 endif()
24
25 if(GETTEXT_FOUND AND ENABLE_GETTEXT)
26         message(STATUS "gettext include path: ${GETTEXT_INCLUDE_DIR}")
27         message(STATUS "gettext msgfmt path: ${GETTEXT_MSGFMT}")
28         if(WIN32)
29                 message(STATUS "gettext library: ${GETTEXT_LIBRARY}")
30                 message(STATUS "gettext dll: ${GETTEXT_DLL}")
31                 message(STATUS "gettext iconv dll: ${GETTEXT_ICONV_DLL}")
32         endif()
33         set(USE_GETTEXT 1)
34         message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
35 elseif(GETTEXT_FOUND AND NOT ENABLE_GETTEXT)
36         MESSAGE(STATUS "GetText found but disabled;")
37 else(GETTEXT_FOUND AND ENABLE_GETTEXT)
38         message(STATUS "GetText disabled")
39 endif(GETTEXT_FOUND AND ENABLE_GETTEXT)
40
41 # user visible option to enable/disable sound
42 OPTION(ENABLE_SOUND "Enable sound" ON)
43
44 # this is only set to 1 if sound is enabled _and_ available
45 set(USE_SOUND 0)
46 set(SOUND_PROBLEM 0)
47
48 if(ENABLE_SOUND AND BUILD_CLIENT)
49         # Sound libraries
50         find_package(OpenAL)
51         find_package(Vorbis)
52         if(NOT OPENAL_FOUND)
53                 message(STATUS "Sound enabled, but OpenAL not found!")
54                 set(SOUND_PROBLEM 1)
55                 MARK_AS_ADVANCED(CLEAR OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
56         endif()
57         if(NOT VORBIS_FOUND)
58                 message(STATUS "Sound enabled, but Vorbis libraries not found!")
59                 set(SOUND_PROBLEM 1)
60                 MARK_AS_ADVANCED(CLEAR OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)
61         endif()
62         if(OPENAL_FOUND AND VORBIS_FOUND)
63                 set(USE_SOUND 1)
64                 message(STATUS "Sound enabled")
65         endif()
66 endif(ENABLE_SOUND AND BUILD_CLIENT)
67
68 if(SOUND_PROBLEM)
69         message(FATAL_ERROR "Sound enabled, but cannot be used.\n"
70                 "To continue, either fill in the required paths or disable sound. (-DENABLE_SOUND=0)")
71 endif()
72 if(USE_SOUND)
73         set(sound_SRCS sound_openal.cpp)
74         set(SOUND_INCLUDE_DIRS
75                 ${OPENAL_INCLUDE_DIR}
76                 ${VORBIS_INCLUDE_DIR}
77                 ${OGG_INCLUDE_DIR}
78                 )
79         set(SOUND_LIBRARIES
80                 ${OPENAL_LIBRARY}
81                 ${VORBIS_LIBRARIES}
82                 )
83 endif()
84
85 if(NOT MSVC)
86         set(USE_GPROF 0 CACHE BOOL "Use -pg flag for g++")
87 endif()
88
89 # Use cmake_config.h
90 add_definitions ( -DUSE_CMAKE_CONFIG_H )
91
92 if(WIN32)
93         # Windows
94         if(MSVC) # MSVC Specifics
95                 # Surpress some useless warnings
96                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
97         else() # Probably MinGW = GCC
98                 set(PLATFORM_LIBS ws2_32.lib)
99         endif()
100         # Zlib stuff
101         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
102                         CACHE PATH "Zlib include directory")
103         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
104                         CACHE FILEPATH "Path to zlibwapi.lib")
105         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
106                         CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
107         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
108                         CACHE PATH "irrlicht dir")
109         set(MINGWM10_DLL ""
110                         CACHE FILEPATH "Path to mingwm10.dll (for installation)")
111         if(ENABLE_SOUND)
112                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
113                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
114                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
115                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
116         endif()
117 else()
118         # Unix probably
119         if(BUILD_CLIENT)
120                 find_package(X11 REQUIRED)
121                 find_package(OpenGL REQUIRED)
122                 find_package(JPEG REQUIRED)
123                 find_package(BZip2 REQUIRED)
124                 find_package(PNG REQUIRED)
125                 if(APPLE)
126                         FIND_LIBRARY(CARBON_LIB Carbon)
127                         FIND_LIBRARY(COCOA_LIB Cocoa)
128                         FIND_LIBRARY(IOKIT_LIB IOKit)
129                         mark_as_advanced(
130                                 CARBON_LIB
131                                 COCOA_LIB
132                                 IOKIT_LIB
133                         )
134                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
135                 endif(APPLE)
136         endif(BUILD_CLIENT)
137         find_package(ZLIB REQUIRED)
138         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
139         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
140         # This way Xxf86vm is found on OpenBSD too
141         find_library(XXF86VM_LIBRARY Xxf86vm)
142         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
143 endif()
144
145 find_package(Jthread REQUIRED)
146 find_package(Sqlite3 REQUIRED)
147
148 # TODO: Create proper find script for Lua
149 set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
150 set(LUA_LIBRARY "lua")
151
152 configure_file(
153         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
154         "${PROJECT_BINARY_DIR}/cmake_config.h"
155 )
156
157 set(common_SRCS
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         servercommand.cpp
197         socket.cpp
198         mapblock.cpp
199         mapsector.cpp
200         map.cpp
201         player.cpp
202         test.cpp
203         sha1.cpp
204         base64.cpp
205         ban.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