]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
Merge remote-tracking branch 'upstream/master'
[minetest.git] / src / CMakeLists.txt
1 project(minetest-delta)
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 OPTION(USE_GETTEXT "Use GetText for internationalization" OFF)
9
10 if(USE_GETTEXT)
11         find_package(GettextLib REQUIRED)
12         message(STATUS "gettext include path: ${GETTEXT_INCLUDE_DIR}")
13         message(STATUS "gettext msgfmt path: ${GETTEXT_MSGFMT}")
14         if(WIN32)
15                 message(STATUS "gettext library: ${GETTEXT_LIBRARY}")
16                 message(STATUS "gettext dll: ${GETTEXT_DLL}")
17                 message(STATUS "gettext iconv dll: ${GETTEXT_ICONV_DLL}")
18         endif()
19         if (GETTEXT_FOUND)
20                 add_definitions( -DUSE_GETTEXT )
21                 message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
22         else()
23                 message(STATUS "ERROR: GetText enabled but not found, disabling")
24                 set(USE_GETTEXT FALSE)
25         endif(GETTEXT_FOUND)
26 else(USE_GETTEXT)
27         message(STATUS "GetText disabled")
28 endif(USE_GETTEXT)
29
30 if(NOT MSVC)
31         set(USE_GPROF 0 CACHE BOOL "Use -pg flag for g++")
32 endif()
33
34 # Use cmake_config.h
35 add_definitions ( -DUSE_CMAKE_CONFIG_H )
36
37 if(WIN32)
38         # Windows
39         if(MSVC) # MSVC Specifics
40                 # Surpress some useless warnings
41                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
42         else() # Probably MinGW = GCC
43                 set(PLATFORM_LIBS ws2_32.lib)
44         endif()
45         # Zlib stuff
46         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
47                         CACHE PATH "Zlib include directory")
48         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
49                         CACHE FILEPATH "Path to zlibwapi.lib")
50         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
51                         CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
52         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
53                         CACHE PATH "irrlicht dir")
54 else()
55         # Unix probably
56         if(BUILD_CLIENT)
57                 find_package(X11 REQUIRED)
58                 find_package(OpenGL REQUIRED)
59                 find_package(JPEG REQUIRED)
60                 find_package(BZip2 REQUIRED)
61                 find_package(PNG REQUIRED)
62                 if(APPLE)
63                         FIND_LIBRARY(CARBON_LIB Carbon)
64                         FIND_LIBRARY(COCOA_LIB Cocoa)
65                         FIND_LIBRARY(IOKIT_LIB IOKit)
66                         mark_as_advanced(
67                                 CARBON_LIB
68                                 COCOA_LIB
69                                 IOKIT_LIB
70                         )
71                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
72                 endif(APPLE)
73         endif(BUILD_CLIENT)
74         find_package(ZLIB REQUIRED)
75         set(PLATFORM_LIBS -lpthread)
76         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
77         # This way Xxf86vm is found on OpenBSD too
78         find_library(XXF86VM_LIBRARY Xxf86vm)
79         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
80 endif()
81
82 find_package(Jthread REQUIRED)
83 find_package(Sqlite3 REQUIRED)
84
85 configure_file(
86         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
87         "${PROJECT_BINARY_DIR}/cmake_config.h"
88 )
89
90 set(common_SRCS
91         content_sao.cpp
92         mapgen.cpp
93         content_inventory.cpp
94         content_nodemeta.cpp
95         content_craft.cpp
96         content_mapblock.cpp
97         content_mapnode.cpp
98         auth.cpp
99         collision.cpp
100         nodemetadata.cpp
101         serverobject.cpp
102         noise.cpp
103         mineral.cpp
104         porting.cpp
105         materials.cpp
106         defaultsettings.cpp
107         mapnode.cpp
108         voxel.cpp
109         mapblockobject.cpp
110         inventory.cpp
111         debug.cpp
112         serialization.cpp
113         light.cpp
114         filesys.cpp
115         connection.cpp
116         environment.cpp
117         server.cpp
118         servercommand.cpp
119         socket.cpp
120         mapblock.cpp
121         mapsector.cpp
122         map.cpp
123         player.cpp
124         utility.cpp
125         test.cpp
126         sha1.cpp
127         base64.cpp
128 )
129
130 # Client sources
131 set(minetest_SRCS
132         ${common_SRCS}
133         content_cao.cpp
134         mapblock_mesh.cpp
135         farmesh.cpp
136         keycode.cpp
137         clouds.cpp
138         clientobject.cpp
139         guiMainMenu.cpp
140         guiKeyChangeMenu.cpp
141         guiMessageMenu.cpp
142         guiTextInputMenu.cpp
143         guiInventoryMenu.cpp
144         guiPauseMenu.cpp
145         guiPasswordChange.cpp
146         client.cpp
147         tile.cpp
148         game.cpp
149         main.cpp
150 )
151
152 # Server sources
153 set(minetestserver_SRCS
154         ${common_SRCS}
155         servermain.cpp
156 )
157
158 include_directories(
159         ${PROJECT_BINARY_DIR}
160         ${IRRLICHT_INCLUDE_DIR}
161         ${ZLIB_INCLUDE_DIR}
162         ${CMAKE_BUILD_TYPE}
163         ${PNG_INCLUDE_DIR}
164         ${GETTEXT_INCLUDE_DIR}
165         ${JTHREAD_INCLUDE_DIR}
166         ${SQLITE3_INCLUDE_DIR}
167 )
168
169 set(EXECUTABLE_OUTPUT_PATH ../bin)
170
171 if(BUILD_CLIENT)
172         add_executable(${PROJECT_NAME} ${minetest_SRCS})
173         target_link_libraries(
174                 ${PROJECT_NAME}
175                 ${ZLIB_LIBRARIES}
176                 ${IRRLICHT_LIBRARY}
177                 ${OPENGL_LIBRARIES}
178                 ${JPEG_LIBRARIES}
179                 ${BZIP2_LIBRARIES}
180                 ${PNG_LIBRARIES}
181                 ${X11_LIBRARIES}
182                 ${GETTEXT_LIBRARY}
183                 ${PLATFORM_LIBS}
184                 ${CLIENT_PLATFORM_LIBS}
185                 ${JTHREAD_LIBRARY}
186                 ${SQLITE3_LIBRARY}
187         )
188 endif(BUILD_CLIENT)
189
190 if(BUILD_SERVER)
191         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
192         target_link_libraries(
193                 ${PROJECT_NAME}server
194                 ${ZLIB_LIBRARIES}
195                 ${PLATFORM_LIBS}
196                 ${JTHREAD_LIBRARY}
197                 ${SQLITE3_LIBRARY}
198         )
199 endif(BUILD_SERVER)
200
201 #
202 # Set some optimizations and tweaks
203 #
204
205 if(MSVC)
206         # Visual Studio
207
208         # EHa enables SEH exceptions (used for catching segfaults)
209         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")
210         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
211         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
212
213         # Debug build doesn't catch exceptions by itself
214         # Add some optimizations because otherwise it's VERY slow
215         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
216         
217         if(BUILD_SERVER)
218                 set_target_properties(${PROJECT_NAME}server PROPERTIES
219                                 COMPILE_DEFINITIONS "SERVER")
220         endif(BUILD_SERVER)
221
222 else()
223         # Probably GCC
224         
225         if(WARN_ALL)
226                 set(RELEASE_WARNING_FLAGS "-Wall")
227         else()
228                 set(RELEASE_WARNING_FLAGS "")
229         endif()
230         
231         if(NOT APPLE)
232                 set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
233         endif()
234         
235         if(APPLE)
236                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
237                 set(ARCH i386)
238         endif()
239
240         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
241         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS}")
242
243         if(USE_GPROF)
244                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
245         endif()
246         
247         if(BUILD_SERVER)
248                 set_target_properties(${PROJECT_NAME}server PROPERTIES
249                                 COMPILE_DEFINITIONS "SERVER")
250         endif(BUILD_SERVER)
251
252 endif()
253
254 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
255 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
256
257 #
258 # Installation
259 #
260
261 # Example configuration file
262 install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../minetest.conf.example" DESTINATION ${EXAMPLE_CONF_DIR})
263
264 if(BUILD_CLIENT)
265         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
266
267         file(GLOB images "${CMAKE_CURRENT_SOURCE_DIR}/../data/*.png")
268
269         install(FILES ${images} DESTINATION ${DATADIR})
270
271         if (USE_GETTEXT)
272                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
273                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
274                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
275                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
276                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
277         endif()
278
279         if(WIN32)
280                 if(DEFINED IRRLICHT_DLL)
281                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
282                 endif()
283                 if(DEFINED ZLIB_DLL)
284                         install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
285                 endif()
286                 if(USE_GETTEXT)
287                         if(DEFINED GETTEXT_DLL)
288                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
289                         endif()
290                         if(DEFINED GETTEXT_ICONV_DLL)
291                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
292                         endif()
293                 endif(USE_GETTEXT)
294         endif()
295 endif(BUILD_CLIENT)
296
297 if(BUILD_SERVER)
298         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
299 endif(BUILD_SERVER)
300
301 if (USE_GETTEXT)
302         add_custom_command(OUTPUT "${GETTEXT_PO_PATH}/en"
303                 COMMAND ${CMAKE_COMMAND} -E make_directory "${GETTEXT_PO_PATH}/en"
304                 COMMENT "po-update [en]: creating translation template base directory")
305         set(POT_FILE "${GETTEXT_PO_PATH}/en/minetest.pot")
306         file(GLOB GETTEXT_POT_DEPS *.cpp *.h)
307         file(GLOB GETTEXT_POT_DEPS_REL RELATIVE ${CMAKE_SOURCE_DIR} *.cpp *.h)
308         add_custom_command(OUTPUT ${POT_FILE}
309                 COMMAND ${GETTEXT_EXTRACT} -F -n -o ${POT_FILE} ${GETTEXT_POT_DEPS_REL}
310                 DEPENDS "${GETTEXT_PO_PATH}/en" ${GETTEXT_POT_DEPS}
311                 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
312                 COMMENT "po-update [en]: updating translation template")
313
314         set(PO_FILES)
315         set(MO_FILES)
316
317         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
318                 # skip the 'en' locale which is treated separately
319                 if (NOT LOCALE STREQUAL "en")
320                         set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
321                         add_custom_command(OUTPUT ${PO_FILE_PATH}
322                                 COMMAND ${GETTEXT_MSGMERGE} -F -U ${PO_FILE_PATH} ${POT_FILE}
323                                 DEPENDS ${POT_FILE}
324                                 WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
325                                 COMMENT "po-update [${LOCALE}]: updating strings")
326
327
328                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
329                         add_custom_command(OUTPUT ${MO_BUILD_PATH}
330                                 COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
331                                 COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
332
333                         set(MO_FILE_PATH "${MO_BUILD_PATH}/minetest.mo")
334
335                         add_custom_command(
336                                 OUTPUT ${MO_FILE_PATH}
337                                 COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
338                                 DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
339                                 WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
340                                 COMMENT "mo-update [${LOCALE}]: Creating mo file."
341                                 )
342
343                         set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
344                         set(PO_FILES ${PO_FILES} ${PO_FILE_PATH})
345                 endif(NOT LOCALE STREQUAL "en")
346         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
347
348         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
349         add_custom_target(updatepo COMMENT "po update" DEPENDS ${PO_FILES})
350 endif(USE_GETTEXT)
351
352 # Subdirectories
353
354 if (JTHREAD_FOUND)
355 else (JTHREAD_FOUND)
356         add_subdirectory(jthread)
357 endif (JTHREAD_FOUND)
358
359 if (SQLITE3_FOUND)
360 else (SQLITE3_FOUND)
361 add_subdirectory(sqlite)
362 endif (SQLITE3_FOUND)
363
364 #end