]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
The huge item definition and item namespace unification patch (itemdef), see http...
[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         inventorymanager.cpp
98         mods.cpp
99         serverremoteplayer.cpp
100         content_abm.cpp
101         craftdef.cpp
102         nameidmapping.cpp
103         itemdef.cpp
104         nodedef.cpp
105         luaentity_common.cpp
106         scriptapi.cpp
107         script.cpp
108         log.cpp
109         content_sao.cpp
110         mapgen.cpp
111         content_nodemeta.cpp
112         content_mapnode.cpp
113         auth.cpp
114         collision.cpp
115         nodemetadata.cpp
116         serverobject.cpp
117         noise.cpp
118         mineral.cpp
119         porting.cpp
120         materials.cpp
121         defaultsettings.cpp
122         mapnode.cpp
123         voxel.cpp
124         inventory.cpp
125         debug.cpp
126         serialization.cpp
127         light.cpp
128         filesys.cpp
129         connection.cpp
130         environment.cpp
131         server.cpp
132         servercommand.cpp
133         socket.cpp
134         mapblock.cpp
135         mapsector.cpp
136         map.cpp
137         player.cpp
138         utility.cpp
139         test.cpp
140         sha1.cpp
141         base64.cpp
142         ban.cpp
143 )
144
145 # This gives us the icon
146 if(WIN32)
147         if(MINGW)
148                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
149                         COMMAND windres.exe -I${CMAKE_CURRENT_SOURCE_DIR}
150                         -i${CMAKE_CURRENT_SOURCE_DIR}/winresource.rc
151                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
152                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
153         else(MINGW) # Probably MSVC
154                 set(common_SRCS ${common_SRCS} winresource.rc)
155         endif(MINGW)
156 endif()
157
158 # Client sources
159 set(minetest_SRCS
160         ${common_SRCS}
161         content_mapblock.cpp
162         content_cao.cpp
163         mesh.cpp
164         mapblock_mesh.cpp
165         farmesh.cpp
166         keycode.cpp
167         camera.cpp
168         clouds.cpp
169         clientobject.cpp
170         guiMainMenu.cpp
171         guiKeyChangeMenu.cpp
172         guiMessageMenu.cpp
173         guiTextInputMenu.cpp
174         guiInventoryMenu.cpp
175         guiPauseMenu.cpp
176         guiPasswordChange.cpp
177         guiDeathScreen.cpp
178         client.cpp
179         tile.cpp
180         game.cpp
181         main.cpp
182 )
183
184 # Server sources
185 set(minetestserver_SRCS
186         ${common_SRCS}
187         servermain.cpp
188 )
189
190 include_directories(
191         ${PROJECT_BINARY_DIR}
192         ${IRRLICHT_INCLUDE_DIR}
193         ${ZLIB_INCLUDE_DIR}
194         ${CMAKE_BUILD_TYPE}
195         ${PNG_INCLUDE_DIR}
196         ${GETTEXT_INCLUDE_DIR}
197         ${JTHREAD_INCLUDE_DIR}
198         ${SQLITE3_INCLUDE_DIR}
199         ${LUA_INCLUDE_DIR}
200 )
201
202 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
203
204 if(BUILD_CLIENT)
205         add_executable(${PROJECT_NAME} ${minetest_SRCS})
206         target_link_libraries(
207                 ${PROJECT_NAME}
208                 ${ZLIB_LIBRARIES}
209                 ${IRRLICHT_LIBRARY}
210                 ${OPENGL_LIBRARIES}
211                 ${JPEG_LIBRARIES}
212                 ${BZIP2_LIBRARIES}
213                 ${PNG_LIBRARIES}
214                 ${X11_LIBRARIES}
215                 ${GETTEXT_LIBRARY}
216                 ${JTHREAD_LIBRARY}
217                 ${SQLITE3_LIBRARY}
218                 ${LUA_LIBRARY}
219                 ${PLATFORM_LIBS}
220                 ${CLIENT_PLATFORM_LIBS}
221         )
222 endif(BUILD_CLIENT)
223
224 if(BUILD_SERVER)
225         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
226         target_link_libraries(
227                 ${PROJECT_NAME}server
228                 ${ZLIB_LIBRARIES}
229                 ${JTHREAD_LIBRARY}
230                 ${SQLITE3_LIBRARY}
231                 ${LUA_LIBRARY}
232                 ${PLATFORM_LIBS}
233         )
234 endif(BUILD_SERVER)
235
236 #
237 # Set some optimizations and tweaks
238 #
239
240 include(CheckCXXCompilerFlag)
241
242 if(MSVC)
243         # Visual Studio
244
245         # EHa enables SEH exceptions (used for catching segfaults)
246         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")
247         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
248         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
249
250         # Debug build doesn't catch exceptions by itself
251         # Add some optimizations because otherwise it's VERY slow
252         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
253
254         # Flags for C files (sqlite)
255         # /MT = Link statically with standard library stuff
256         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
257         
258         if(BUILD_SERVER)
259                 set_target_properties(${PROJECT_NAME}server PROPERTIES
260                                 COMPILE_DEFINITIONS "SERVER")
261         endif(BUILD_SERVER)
262
263 else()
264         # Probably GCC
265         
266         if(WARN_ALL)
267                 set(RELEASE_WARNING_FLAGS "-Wall")
268         else()
269                 set(RELEASE_WARNING_FLAGS "")
270         endif()
271         
272         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
273                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
274                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
275                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
276                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
277         endif()
278         
279         if(APPLE)
280                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
281                 set(ARCH i386)
282         endif()
283
284         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
285         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS}")
286
287         if(USE_GPROF)
288                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
289         endif()
290         
291         if(BUILD_SERVER)
292                 set_target_properties(${PROJECT_NAME}server PROPERTIES
293                                 COMPILE_DEFINITIONS "SERVER")
294         endif(BUILD_SERVER)
295
296 endif()
297
298 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
299 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
300
301 #
302 # Installation
303 #
304
305 # Example configuration file
306 # NOTE: Install is handled elsewhere
307 #install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../minetest.conf.example" DESTINATION ${EXAMPLE_CONF_DIR})
308
309 if(BUILD_CLIENT)
310         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
311
312         #file(GLOB images "${CMAKE_CURRENT_SOURCE_DIR}/../data/textures/*.png")
313         #install(FILES ${images} DESTINATION ${DATADIR}/textures)
314         #file(GLOB datasubstuff "${CMAKE_CURRENT_SOURCE_DIR}/../data/*")
315         #install(DIRECTORY "${datasubstuff}" DESTINATION ${DATADIR})
316         install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../data/" DESTINATION ${DATADIR})
317
318         if(USE_GETTEXT)
319                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
320                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
321                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
322                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
323                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
324         endif()
325
326         if(WIN32)
327                 if(DEFINED IRRLICHT_DLL)
328                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
329                 endif()
330                 if(DEFINED ZLIB_DLL)
331                         install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
332                 endif()
333                 if(USE_GETTEXT)
334                         if(DEFINED GETTEXT_DLL)
335                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
336                         endif()
337                         if(DEFINED GETTEXT_ICONV_DLL)
338                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
339                         endif()
340                 endif(USE_GETTEXT)
341         endif()
342 endif(BUILD_CLIENT)
343
344 if(BUILD_SERVER)
345         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
346 endif(BUILD_SERVER)
347
348 if (USE_GETTEXT)
349         set(MO_FILES)
350
351         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
352                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
353                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
354                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
355
356                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
357                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
358                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
359
360                 add_custom_command(
361                         OUTPUT ${MO_FILE_PATH}
362                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
363                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
364                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
365                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
366                         )
367
368                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
369         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
370
371         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
372 endif(USE_GETTEXT)
373
374 # Subdirectories
375
376 if (JTHREAD_FOUND)
377 else (JTHREAD_FOUND)
378         add_subdirectory(jthread)
379 endif (JTHREAD_FOUND)
380
381 if (SQLITE3_FOUND)
382 else (SQLITE3_FOUND)
383         add_subdirectory(sqlite)
384 endif (SQLITE3_FOUND)
385
386 if (LUA_FOUND)
387 else (LUA_FOUND)
388         add_subdirectory(lua)
389 endif (LUA_FOUND)
390
391 #end