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