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