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