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