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