]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
ObjectRef:get_player_name, ObjectRef:inventory_set_list, ObjectRef:inventory_get_list
[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         craftitemdef.cpp
103         luaentity_common.cpp
104         scriptapi.cpp
105         script.cpp
106         log.cpp
107         content_sao.cpp
108         mapgen.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 # NOTE: Install is handled elsewhere
306 #install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../minetest.conf.example" DESTINATION ${EXAMPLE_CONF_DIR})
307
308 if(BUILD_CLIENT)
309         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
310
311         #file(GLOB images "${CMAKE_CURRENT_SOURCE_DIR}/../data/textures/*.png")
312         #install(FILES ${images} DESTINATION ${DATADIR}/textures)
313         #file(GLOB datasubstuff "${CMAKE_CURRENT_SOURCE_DIR}/../data/*")
314         #install(DIRECTORY "${datasubstuff}" DESTINATION ${DATADIR})
315         install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../data/" DESTINATION ${DATADIR})
316
317         if(USE_GETTEXT)
318                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
319                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
320                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
321                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
322                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
323         endif()
324
325         if(WIN32)
326                 if(DEFINED IRRLICHT_DLL)
327                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
328                 endif()
329                 if(DEFINED ZLIB_DLL)
330                         install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
331                 endif()
332                 if(USE_GETTEXT)
333                         if(DEFINED GETTEXT_DLL)
334                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
335                         endif()
336                         if(DEFINED GETTEXT_ICONV_DLL)
337                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
338                         endif()
339                 endif(USE_GETTEXT)
340         endif()
341 endif(BUILD_CLIENT)
342
343 if(BUILD_SERVER)
344         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
345 endif(BUILD_SERVER)
346
347 if (USE_GETTEXT)
348         set(MO_FILES)
349
350         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
351                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
352                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
353                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
354
355                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
356                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
357                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
358
359                 add_custom_command(
360                         OUTPUT ${MO_FILE_PATH}
361                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
362                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
363                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
364                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
365                         )
366
367                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
368         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
369
370         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
371 endif(USE_GETTEXT)
372
373 # Subdirectories
374
375 if (JTHREAD_FOUND)
376 else (JTHREAD_FOUND)
377         add_subdirectory(jthread)
378 endif (JTHREAD_FOUND)
379
380 if (SQLITE3_FOUND)
381 else (SQLITE3_FOUND)
382         add_subdirectory(sqlite)
383 endif (SQLITE3_FOUND)
384
385 if (LUA_FOUND)
386 else (LUA_FOUND)
387         add_subdirectory(lua)
388 endif (LUA_FOUND)
389
390 #end