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