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