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