]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
Improve the look of fences
[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.")
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         if(ENABLE_SOUND)
110                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
111                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
112                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
113                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
114         endif()
115 else()
116         # Unix probably
117         if(BUILD_CLIENT)
118                 find_package(X11 REQUIRED)
119                 find_package(OpenGL REQUIRED)
120                 find_package(JPEG REQUIRED)
121                 find_package(BZip2 REQUIRED)
122                 find_package(PNG REQUIRED)
123                 if(APPLE)
124                         FIND_LIBRARY(CARBON_LIB Carbon)
125                         FIND_LIBRARY(COCOA_LIB Cocoa)
126                         FIND_LIBRARY(IOKIT_LIB IOKit)
127                         mark_as_advanced(
128                                 CARBON_LIB
129                                 COCOA_LIB
130                                 IOKIT_LIB
131                         )
132                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
133                 endif(APPLE)
134         endif(BUILD_CLIENT)
135         find_package(ZLIB REQUIRED)
136         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
137         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
138         # This way Xxf86vm is found on OpenBSD too
139         find_library(XXF86VM_LIBRARY Xxf86vm)
140         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
141 endif()
142
143 find_package(Jthread REQUIRED)
144 find_package(Sqlite3 REQUIRED)
145
146 # TODO: Create proper find script for Lua
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         genericobject.cpp
157         voxelalgorithms.cpp
158         sound.cpp
159         quicktune.cpp
160         subgame.cpp
161         inventorymanager.cpp
162         mods.cpp
163         content_abm.cpp
164         craftdef.cpp
165         nameidmapping.cpp
166         itemdef.cpp
167         nodedef.cpp
168         luaentity_common.cpp
169         scriptapi.cpp
170         script.cpp
171         log.cpp
172         content_sao.cpp
173         mapgen.cpp
174         content_nodemeta.cpp
175         content_mapnode.cpp
176         auth.cpp
177         collision.cpp
178         nodemetadata.cpp
179         serverobject.cpp
180         noise.cpp
181         porting.cpp
182         tool.cpp
183         defaultsettings.cpp
184         mapnode.cpp
185         voxel.cpp
186         inventory.cpp
187         debug.cpp
188         serialization.cpp
189         light.cpp
190         filesys.cpp
191         connection.cpp
192         environment.cpp
193         server.cpp
194         servercommand.cpp
195         socket.cpp
196         mapblock.cpp
197         mapsector.cpp
198         map.cpp
199         player.cpp
200         utility.cpp
201         test.cpp
202         sha1.cpp
203         base64.cpp
204         ban.cpp
205 )
206
207 # This gives us the icon
208 if(WIN32)
209         if(MINGW)
210                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
211                         COMMAND windres.exe -I${CMAKE_CURRENT_SOURCE_DIR}
212                         -i${CMAKE_CURRENT_SOURCE_DIR}/winresource.rc
213                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
214                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
215         else(MINGW) # Probably MSVC
216                 set(common_SRCS ${common_SRCS} winresource.rc)
217         endif(MINGW)
218 endif()
219
220 # Client sources
221 set(minetest_SRCS
222         ${common_SRCS}
223         ${sound_SRCS}
224         sky.cpp
225         clientmap.cpp
226         content_cso.cpp
227         content_mapblock.cpp
228         content_cao.cpp
229         mesh.cpp
230         mapblock_mesh.cpp
231         farmesh.cpp
232         keycode.cpp
233         camera.cpp
234         clouds.cpp
235         clientobject.cpp
236         chat.cpp
237         guiMainMenu.cpp
238         guiKeyChangeMenu.cpp
239         guiMessageMenu.cpp
240         guiTextInputMenu.cpp
241         guiInventoryMenu.cpp
242         guiPauseMenu.cpp
243         guiPasswordChange.cpp
244         guiDeathScreen.cpp
245         guiChatConsole.cpp
246         guiCreateWorld.cpp
247         guiConfirmMenu.cpp
248         client.cpp
249         filecache.cpp
250         tile.cpp
251         game.cpp
252         main.cpp
253 )
254
255 # Server sources
256 set(minetestserver_SRCS
257         ${common_SRCS}
258         main.cpp
259 )
260
261 include_directories(
262         ${PROJECT_BINARY_DIR}
263         ${IRRLICHT_INCLUDE_DIR}
264         ${ZLIB_INCLUDE_DIR}
265         ${CMAKE_BUILD_TYPE}
266         ${PNG_INCLUDE_DIR}
267         ${GETTEXT_INCLUDE_DIR}
268         ${SOUND_INCLUDE_DIRS}
269         ${JTHREAD_INCLUDE_DIR}
270         ${SQLITE3_INCLUDE_DIR}
271         ${LUA_INCLUDE_DIR}
272 )
273
274 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
275
276 if(BUILD_CLIENT)
277         add_executable(${PROJECT_NAME} ${minetest_SRCS})
278         target_link_libraries(
279                 ${PROJECT_NAME}
280                 ${ZLIB_LIBRARIES}
281                 ${IRRLICHT_LIBRARY}
282                 ${OPENGL_LIBRARIES}
283                 ${JPEG_LIBRARIES}
284                 ${BZIP2_LIBRARIES}
285                 ${PNG_LIBRARIES}
286                 ${X11_LIBRARIES}
287                 ${GETTEXT_LIBRARY}
288                 ${SOUND_LIBRARIES}
289                 ${JTHREAD_LIBRARY}
290                 ${SQLITE3_LIBRARY}
291                 ${LUA_LIBRARY}
292                 ${PLATFORM_LIBS}
293                 ${CLIENT_PLATFORM_LIBS}
294         )
295 endif(BUILD_CLIENT)
296
297 if(BUILD_SERVER)
298         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
299         target_link_libraries(
300                 ${PROJECT_NAME}server
301                 ${ZLIB_LIBRARIES}
302                 ${JTHREAD_LIBRARY}
303                 ${SQLITE3_LIBRARY}
304                 ${LUA_LIBRARY}
305                 ${PLATFORM_LIBS}
306         )
307 endif(BUILD_SERVER)
308
309 #
310 # Set some optimizations and tweaks
311 #
312
313 include(CheckCXXCompilerFlag)
314
315 if(MSVC)
316         # Visual Studio
317
318         # EHa enables SEH exceptions (used for catching segfaults)
319         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")
320         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
321         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
322
323         # Debug build doesn't catch exceptions by itself
324         # Add some optimizations because otherwise it's VERY slow
325         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
326
327         # Flags for C files (sqlite)
328         # /MT = Link statically with standard library stuff
329         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
330         
331         if(BUILD_SERVER)
332                 set_target_properties(${PROJECT_NAME}server PROPERTIES
333                                 COMPILE_DEFINITIONS "SERVER")
334         endif(BUILD_SERVER)
335
336 else()
337         # Probably GCC
338         
339         if(WARN_ALL)
340                 set(RELEASE_WARNING_FLAGS "-Wall")
341         else()
342                 set(RELEASE_WARNING_FLAGS "")
343         endif()
344         
345         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
346                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
347                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
348                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
349                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
350         endif()
351         
352         if(APPLE)
353                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
354                 set(ARCH i386)
355         endif()
356
357         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
358         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS}")
359
360         if(USE_GPROF)
361                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
362         endif()
363         
364         if(BUILD_SERVER)
365                 set_target_properties(${PROJECT_NAME}server PROPERTIES
366                                 COMPILE_DEFINITIONS "SERVER")
367         endif(BUILD_SERVER)
368
369 endif()
370
371 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
372 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
373
374 #
375 # Installation
376 #
377 if(WIN32)
378         if(DEFINED ZLIB_DLL)
379                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
380         endif()
381         if(USE_SOUND)
382                 if(OPENAL_DLL)
383                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
384                 endif()
385                 if(OGG_DLL)
386                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
387                 endif()
388                 if(VORBIS_DLL)
389                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
390                 endif()
391                 if(VORBISFILE_DLL)
392                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
393                 endif()
394         endif()
395 endif()
396
397 if(BUILD_CLIENT)
398         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
399
400         if(USE_GETTEXT)
401                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
402                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
403                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
404                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
405                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
406         endif()
407
408         if(WIN32)
409                 if(DEFINED IRRLICHT_DLL)
410                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
411                 endif()
412                 if(USE_GETTEXT)
413                         if(DEFINED GETTEXT_DLL)
414                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
415                         endif()
416                         if(DEFINED GETTEXT_ICONV_DLL)
417                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
418                         endif()
419                 endif(USE_GETTEXT)
420         endif()
421 endif(BUILD_CLIENT)
422
423 if(BUILD_SERVER)
424         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
425 endif(BUILD_SERVER)
426
427 if (USE_GETTEXT)
428         set(MO_FILES)
429
430         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
431                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
432                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
433                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
434
435                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
436                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
437                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
438
439                 add_custom_command(
440                         OUTPUT ${MO_FILE_PATH}
441                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
442                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
443                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
444                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
445                         )
446
447                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
448         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
449
450         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
451 endif(USE_GETTEXT)
452
453 # Subdirectories
454
455 if (JTHREAD_FOUND)
456 else (JTHREAD_FOUND)
457         add_subdirectory(jthread)
458 endif (JTHREAD_FOUND)
459
460 if (SQLITE3_FOUND)
461 else (SQLITE3_FOUND)
462         add_subdirectory(sqlite)
463 endif (SQLITE3_FOUND)
464
465 if (LUA_FOUND)
466 else (LUA_FOUND)
467         add_subdirectory(lua)
468 endif (LUA_FOUND)
469
470 #end