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