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