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