c50b74dc517d6570ab388f3462ba86099d895714
[oweals/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                         if (NOT LOCALE STREQUAL "en")
271                                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
272                                 set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
273                                 install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
274                         endif(NOT LOCALE STREQUAL "en")
275                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
276         endif()
277
278         if(WIN32)
279                 if(DEFINED IRRLICHT_DLL)
280                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
281                 endif()
282                 if(DEFINED ZLIB_DLL)
283                         install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
284                 endif()
285                 if(GETTEXT_FOUND AND USE_GETTEXT)
286                         if(DEFINED GETTEXT_DLL)
287                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
288                         endif()
289                         if(DEFINED GETTEXT_ICONV_DLL)
290                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
291                         endif()
292                 endif(GETTEXT_FOUND AND USE_GETTEXT)
293         endif()
294 endif(BUILD_CLIENT)
295
296 if(BUILD_SERVER)
297         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
298 endif(BUILD_SERVER)
299
300 if (GETTEXT_FOUND AND USE_GETTEXT)
301         add_custom_command(OUTPUT "${GETTEXT_PO_PATH}/en"
302                 COMMAND ${CMAKE_COMMAND} -E make_directory "${GETTEXT_PO_PATH}/en"
303                 COMMENT "po-update [en]: creating translation template base directory")
304         set(POT_FILE "${GETTEXT_PO_PATH}/en/minetest.pot")
305         file(GLOB GETTEXT_POT_DEPS *.cpp *.h)
306         file(GLOB GETTEXT_POT_DEPS_REL RELATIVE ${CMAKE_SOURCE_DIR} *.cpp *.h)
307         add_custom_command(OUTPUT ${POT_FILE}
308                 COMMAND ${GETTEXT_EXTRACT} -F -n -o ${POT_FILE} ${GETTEXT_POT_DEPS_REL}
309                 DEPENDS "${GETTEXT_PO_PATH}/en" ${GETTEXT_POT_DEPS}
310                 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
311                 COMMENT "po-update [en]: updating translation template")
312
313         set(PO_FILES)
314         set(MO_FILES)
315
316         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
317                 # skip the 'en' locale which is treated separately
318                 if (NOT LOCALE STREQUAL "en")
319                         set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
320                         add_custom_command(OUTPUT ${PO_FILE_PATH}
321                                 COMMAND ${GETTEXT_MSGMERGE} -F -U ${PO_FILE_PATH} ${POT_FILE}
322                                 DEPENDS ${POT_FILE}
323                                 WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
324                                 COMMENT "po-update [${LOCALE}]: updating strings")
325
326
327                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
328                         add_custom_command(OUTPUT ${MO_BUILD_PATH}
329                                 COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
330                                 COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
331
332                         set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
333
334                         add_custom_command(
335                                 OUTPUT ${MO_FILE_PATH}
336                                 COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
337                                 DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
338                                 WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
339                                 COMMENT "mo-update [${LOCALE}]: Creating mo file."
340                                 )
341
342                         set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
343                         set(PO_FILES ${PO_FILES} ${PO_FILE_PATH})
344                 endif(NOT LOCALE STREQUAL "en")
345         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
346
347         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
348         add_custom_target(updatepo COMMENT "po update" DEPENDS ${PO_FILES})
349 endif(GETTEXT_FOUND AND USE_GETTEXT)
350
351 # Subdirectories
352
353 if (JTHREAD_FOUND)
354 else (JTHREAD_FOUND)
355         add_subdirectory(jthread)
356 endif (JTHREAD_FOUND)
357
358 if (SQLITE3_FOUND)
359 else (SQLITE3_FOUND)
360 add_subdirectory(sqlite)
361 endif (SQLITE3_FOUND)
362
363 #end