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