]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
Replace old active block random node modifying things with actual ActiveBlockModifiers
[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 # user-visible option to enable/disable gettext usage
9 OPTION(ENABLE_GETTEXT "Use GetText for internationalization" ON)
10
11 # this is only set to 1 if gettext is enabled _and_ available
12 set(USE_GETTEXT 0)
13
14 find_package(GettextLib)
15
16 if(GETTEXT_FOUND AND ENABLE_GETTEXT)
17         message(STATUS "gettext include path: ${GETTEXT_INCLUDE_DIR}")
18         message(STATUS "gettext msgfmt path: ${GETTEXT_MSGFMT}")
19         if(WIN32)
20                 message(STATUS "gettext library: ${GETTEXT_LIBRARY}")
21                 message(STATUS "gettext dll: ${GETTEXT_DLL}")
22                 message(STATUS "gettext iconv dll: ${GETTEXT_ICONV_DLL}")
23         endif()
24         set(USE_GETTEXT 1)
25         message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
26 elseif(GETTEXT_FOUND AND NOT ENABLE_GETTEXT)
27         MESSAGE(STATUS "GetText found but disabled;")
28 else(GETTEXT_FOUND AND ENABLE_GETTEXT)
29         message(STATUS "GetText disabled")
30 endif(GETTEXT_FOUND AND ENABLE_GETTEXT)
31
32 if(NOT MSVC)
33         set(USE_GPROF 0 CACHE BOOL "Use -pg flag for g++")
34 endif()
35
36 # Use cmake_config.h
37 add_definitions ( -DUSE_CMAKE_CONFIG_H )
38
39 if(WIN32)
40         # Windows
41         if(MSVC) # MSVC Specifics
42                 # Surpress some useless warnings
43                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
44         else() # Probably MinGW = GCC
45                 set(PLATFORM_LIBS ws2_32.lib)
46         endif()
47         # Zlib stuff
48         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
49                         CACHE PATH "Zlib include directory")
50         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
51                         CACHE FILEPATH "Path to zlibwapi.lib")
52         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
53                         CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
54         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
55                         CACHE PATH "irrlicht dir")
56 else()
57         # Unix probably
58         if(BUILD_CLIENT)
59                 find_package(X11 REQUIRED)
60                 find_package(OpenGL REQUIRED)
61                 find_package(JPEG REQUIRED)
62                 find_package(BZip2 REQUIRED)
63                 find_package(PNG REQUIRED)
64                 if(APPLE)
65                         FIND_LIBRARY(CARBON_LIB Carbon)
66                         FIND_LIBRARY(COCOA_LIB Cocoa)
67                         FIND_LIBRARY(IOKIT_LIB IOKit)
68                         mark_as_advanced(
69                                 CARBON_LIB
70                                 COCOA_LIB
71                                 IOKIT_LIB
72                         )
73                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
74                 endif(APPLE)
75         endif(BUILD_CLIENT)
76         find_package(ZLIB REQUIRED)
77         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
78         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
79         # This way Xxf86vm is found on OpenBSD too
80         find_library(XXF86VM_LIBRARY Xxf86vm)
81         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
82 endif()
83
84 find_package(Jthread REQUIRED)
85 find_package(Sqlite3 REQUIRED)
86
87 # TODO: Create proper find script for Lua
88 set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
89 set(LUA_LIBRARY "lua")
90
91 configure_file(
92         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
93         "${PROJECT_BINARY_DIR}/cmake_config.h"
94 )
95
96 set(common_SRCS
97         content_abm.cpp
98         craftdef.cpp
99         nameidmapping.cpp
100         tooldef.cpp
101         nodedef.cpp
102         luaentity_common.cpp
103         scriptapi.cpp
104         script.cpp
105         log.cpp
106         content_sao.cpp
107         mapgen.cpp
108         content_inventory.cpp
109         content_nodemeta.cpp
110         content_craft.cpp
111         content_mapnode.cpp
112         auth.cpp
113         collision.cpp
114         nodemetadata.cpp
115         serverobject.cpp
116         noise.cpp
117         mineral.cpp
118         porting.cpp
119         materials.cpp
120         defaultsettings.cpp
121         mapnode.cpp
122         voxel.cpp
123         inventory.cpp
124         debug.cpp
125         serialization.cpp
126         light.cpp
127         filesys.cpp
128         connection.cpp
129         environment.cpp
130         server.cpp
131         servercommand.cpp
132         socket.cpp
133         mapblock.cpp
134         mapsector.cpp
135         map.cpp
136         player.cpp
137         utility.cpp
138         test.cpp
139         sha1.cpp
140         base64.cpp
141         ban.cpp
142 )
143
144 # This gives us the icon
145 if(WIN32)
146         if(MINGW)
147                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
148                         COMMAND windres.exe -I${CMAKE_CURRENT_SOURCE_DIR}
149                         -i${CMAKE_CURRENT_SOURCE_DIR}/winresource.rc
150                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
151                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
152         else(MINGW) # Probably MSVC
153                 set(common_SRCS ${common_SRCS} winresource.rc)
154         endif(MINGW)
155 endif()
156
157 # Client sources
158 set(minetest_SRCS
159         ${common_SRCS}
160         MyBillboardSceneNode.cpp
161         content_mapblock.cpp
162         content_cao.cpp
163         mapblock_mesh.cpp
164         farmesh.cpp
165         keycode.cpp
166         camera.cpp
167         clouds.cpp
168         clientobject.cpp
169         guiMainMenu.cpp
170         guiKeyChangeMenu.cpp
171         guiMessageMenu.cpp
172         guiTextInputMenu.cpp
173         guiInventoryMenu.cpp
174         guiPauseMenu.cpp
175         guiPasswordChange.cpp
176         guiDeathScreen.cpp
177         client.cpp
178         tile.cpp
179         game.cpp
180         main.cpp
181 )
182
183 # Server sources
184 set(minetestserver_SRCS
185         ${common_SRCS}
186         servermain.cpp
187 )
188
189 include_directories(
190         ${PROJECT_BINARY_DIR}
191         ${IRRLICHT_INCLUDE_DIR}
192         ${ZLIB_INCLUDE_DIR}
193         ${CMAKE_BUILD_TYPE}
194         ${PNG_INCLUDE_DIR}
195         ${GETTEXT_INCLUDE_DIR}
196         ${JTHREAD_INCLUDE_DIR}
197         ${SQLITE3_INCLUDE_DIR}
198         ${LUA_INCLUDE_DIR}
199 )
200
201 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
202
203 if(BUILD_CLIENT)
204         add_executable(${PROJECT_NAME} ${minetest_SRCS})
205         target_link_libraries(
206                 ${PROJECT_NAME}
207                 ${ZLIB_LIBRARIES}
208                 ${IRRLICHT_LIBRARY}
209                 ${OPENGL_LIBRARIES}
210                 ${JPEG_LIBRARIES}
211                 ${BZIP2_LIBRARIES}
212                 ${PNG_LIBRARIES}
213                 ${X11_LIBRARIES}
214                 ${GETTEXT_LIBRARY}
215                 ${JTHREAD_LIBRARY}
216                 ${SQLITE3_LIBRARY}
217                 ${LUA_LIBRARY}
218                 ${PLATFORM_LIBS}
219                 ${CLIENT_PLATFORM_LIBS}
220         )
221 endif(BUILD_CLIENT)
222
223 if(BUILD_SERVER)
224         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
225         target_link_libraries(
226                 ${PROJECT_NAME}server
227                 ${ZLIB_LIBRARIES}
228                 ${JTHREAD_LIBRARY}
229                 ${SQLITE3_LIBRARY}
230                 ${LUA_LIBRARY}
231                 ${PLATFORM_LIBS}
232         )
233 endif(BUILD_SERVER)
234
235 #
236 # Set some optimizations and tweaks
237 #
238
239 include(CheckCXXCompilerFlag)
240
241 if(MSVC)
242         # Visual Studio
243
244         # EHa enables SEH exceptions (used for catching segfaults)
245         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")
246         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
247         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
248
249         # Debug build doesn't catch exceptions by itself
250         # Add some optimizations because otherwise it's VERY slow
251         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
252
253         # Flags for C files (sqlite)
254         # /MT = Link statically with standard library stuff
255         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
256         
257         if(BUILD_SERVER)
258                 set_target_properties(${PROJECT_NAME}server PROPERTIES
259                                 COMPILE_DEFINITIONS "SERVER")
260         endif(BUILD_SERVER)
261
262 else()
263         # Probably GCC
264         
265         if(WARN_ALL)
266                 set(RELEASE_WARNING_FLAGS "-Wall")
267         else()
268                 set(RELEASE_WARNING_FLAGS "")
269         endif()
270         
271         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
272                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
273                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
274                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
275                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
276         endif()
277         
278         if(APPLE)
279                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
280                 set(ARCH i386)
281         endif()
282
283         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
284         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS}")
285
286         if(USE_GPROF)
287                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
288         endif()
289         
290         if(BUILD_SERVER)
291                 set_target_properties(${PROJECT_NAME}server PROPERTIES
292                                 COMPILE_DEFINITIONS "SERVER")
293         endif(BUILD_SERVER)
294
295 endif()
296
297 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
298 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
299
300 #
301 # Installation
302 #
303
304 # Example configuration file
305 install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../minetest.conf.example" DESTINATION ${EXAMPLE_CONF_DIR})
306
307 if(BUILD_CLIENT)
308         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
309
310         file(GLOB images "${CMAKE_CURRENT_SOURCE_DIR}/../data/textures/*.png")
311         install(FILES ${images} DESTINATION ${DATADIR}/textures)
312
313         if(USE_GETTEXT)
314                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
315                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
316                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
317                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
318                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
319         endif()
320
321         if(WIN32)
322                 if(DEFINED IRRLICHT_DLL)
323                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
324                 endif()
325                 if(DEFINED ZLIB_DLL)
326                         install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
327                 endif()
328                 if(USE_GETTEXT)
329                         if(DEFINED GETTEXT_DLL)
330                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
331                         endif()
332                         if(DEFINED GETTEXT_ICONV_DLL)
333                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
334                         endif()
335                 endif(USE_GETTEXT)
336         endif()
337 endif(BUILD_CLIENT)
338
339 if(BUILD_SERVER)
340         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
341 endif(BUILD_SERVER)
342
343 if (USE_GETTEXT)
344         set(MO_FILES)
345
346         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
347                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
348                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
349                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
350
351                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
352                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
353                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
354
355                 add_custom_command(
356                         OUTPUT ${MO_FILE_PATH}
357                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
358                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
359                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
360                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
361                         )
362
363                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
364         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
365
366         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
367 endif(USE_GETTEXT)
368
369 # Subdirectories
370
371 if (JTHREAD_FOUND)
372 else (JTHREAD_FOUND)
373         add_subdirectory(jthread)
374 endif (JTHREAD_FOUND)
375
376 if (SQLITE3_FOUND)
377 else (SQLITE3_FOUND)
378         add_subdirectory(sqlite)
379 endif (SQLITE3_FOUND)
380
381 if (LUA_FOUND)
382 else (LUA_FOUND)
383         add_subdirectory(lua)
384 endif (LUA_FOUND)
385
386 #end