Merge remote-tracking branch 'origin/upstream'
[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 # 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 )
131
132 # This gives us the icon
133 if(WIN32 AND MSVC)
134         set(common_SRCS ${common_SRCS} winresource.rc)
135 endif()
136
137 # Client sources
138 set(minetest_SRCS
139         ${common_SRCS}
140         content_cao.cpp
141         mapblock_mesh.cpp
142         farmesh.cpp
143         keycode.cpp
144         clouds.cpp
145         clientobject.cpp
146         guiMainMenu.cpp
147         guiKeyChangeMenu.cpp
148         guiMessageMenu.cpp
149         guiTextInputMenu.cpp
150         guiInventoryMenu.cpp
151         guiPauseMenu.cpp
152         guiPasswordChange.cpp
153         client.cpp
154         tile.cpp
155         game.cpp
156         main.cpp
157 )
158
159 # Server sources
160 set(minetestserver_SRCS
161         ${common_SRCS}
162         servermain.cpp
163 )
164
165 include_directories(
166         ${PROJECT_BINARY_DIR}
167         ${IRRLICHT_INCLUDE_DIR}
168         ${ZLIB_INCLUDE_DIR}
169         ${CMAKE_BUILD_TYPE}
170         ${PNG_INCLUDE_DIR}
171         ${GETTEXT_INCLUDE_DIR}
172         ${JTHREAD_INCLUDE_DIR}
173         ${SQLITE3_INCLUDE_DIR}
174 )
175
176 set(EXECUTABLE_OUTPUT_PATH ../bin)
177
178 if(BUILD_CLIENT)
179         add_executable(${PROJECT_NAME} ${minetest_SRCS})
180         target_link_libraries(
181                 ${PROJECT_NAME}
182                 ${ZLIB_LIBRARIES}
183                 ${IRRLICHT_LIBRARY}
184                 ${OPENGL_LIBRARIES}
185                 ${JPEG_LIBRARIES}
186                 ${BZIP2_LIBRARIES}
187                 ${PNG_LIBRARIES}
188                 ${X11_LIBRARIES}
189                 ${GETTEXT_LIBRARY}
190                 ${PLATFORM_LIBS}
191                 ${CLIENT_PLATFORM_LIBS}
192                 ${JTHREAD_LIBRARY}
193                 ${SQLITE3_LIBRARY}
194         )
195 endif(BUILD_CLIENT)
196
197 if(BUILD_SERVER)
198         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
199         target_link_libraries(
200                 ${PROJECT_NAME}server
201                 ${ZLIB_LIBRARIES}
202                 ${PLATFORM_LIBS}
203                 ${JTHREAD_LIBRARY}
204                 ${SQLITE3_LIBRARY}
205         )
206 endif(BUILD_SERVER)
207
208 #
209 # Set some optimizations and tweaks
210 #
211
212 if(MSVC)
213         # Visual Studio
214
215         # EHa enables SEH exceptions (used for catching segfaults)
216         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")
217         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
218         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
219
220         # Debug build doesn't catch exceptions by itself
221         # Add some optimizations because otherwise it's VERY slow
222         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
223         
224         if(BUILD_SERVER)
225                 set_target_properties(${PROJECT_NAME}server PROPERTIES
226                                 COMPILE_DEFINITIONS "SERVER")
227         endif(BUILD_SERVER)
228
229 else()
230         # Probably GCC
231         
232         if(WARN_ALL)
233                 set(RELEASE_WARNING_FLAGS "-Wall")
234         else()
235                 set(RELEASE_WARNING_FLAGS "")
236         endif()
237         
238         if(NOT APPLE)
239                 set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
240         endif()
241         
242         if(APPLE)
243                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
244                 set(ARCH i386)
245         endif()
246
247         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
248         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS}")
249
250         if(USE_GPROF)
251                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
252         endif()
253         
254         if(BUILD_SERVER)
255                 set_target_properties(${PROJECT_NAME}server PROPERTIES
256                                 COMPILE_DEFINITIONS "SERVER")
257         endif(BUILD_SERVER)
258
259 endif()
260
261 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
262 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
263
264 #
265 # Installation
266 #
267
268 # Example configuration file
269 install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../minetest.conf.example" DESTINATION ${EXAMPLE_CONF_DIR})
270
271 if(BUILD_CLIENT)
272         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
273
274         file(GLOB images "${CMAKE_CURRENT_SOURCE_DIR}/../data/*.png")
275
276         install(FILES ${images} DESTINATION ${DATADIR})
277
278         if(USE_GETTEXT)
279                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
280                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
281                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
282                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
283                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
284         endif()
285
286         if(WIN32)
287                 if(DEFINED IRRLICHT_DLL)
288                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
289                 endif()
290                 if(DEFINED ZLIB_DLL)
291                         install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
292                 endif()
293                 if(USE_GETTEXT)
294                         if(DEFINED GETTEXT_DLL)
295                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
296                         endif()
297                         if(DEFINED GETTEXT_ICONV_DLL)
298                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
299                         endif()
300                 endif(USE_GETTEXT)
301         endif()
302 endif(BUILD_CLIENT)
303
304 if(BUILD_SERVER)
305         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
306 endif(BUILD_SERVER)
307
308 if (USE_GETTEXT)
309         set(MO_FILES)
310
311         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
312                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
313                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
314                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
315
316                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
317                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
318                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
319
320                 add_custom_command(
321                         OUTPUT ${MO_FILE_PATH}
322                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
323                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
324                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
325                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
326                         )
327
328                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
329         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
330
331         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
332 endif(USE_GETTEXT)
333
334 # Subdirectories
335
336 if (JTHREAD_FOUND)
337 else (JTHREAD_FOUND)
338         add_subdirectory(jthread)
339 endif (JTHREAD_FOUND)
340
341 if (SQLITE3_FOUND)
342 else (SQLITE3_FOUND)
343 add_subdirectory(sqlite)
344 endif (SQLITE3_FOUND)
345
346 #end