Move images to data/textures and fix some path stuff; hope that installation still...
[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         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/textures/*.png")
303         install(FILES ${images} DESTINATION ${DATADIR}/textures)
304
305         if(USE_GETTEXT)
306                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
307                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
308                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
309                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
310                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
311         endif()
312
313         if(WIN32)
314                 if(DEFINED IRRLICHT_DLL)
315                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
316                 endif()
317                 if(DEFINED ZLIB_DLL)
318                         install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
319                 endif()
320                 if(USE_GETTEXT)
321                         if(DEFINED GETTEXT_DLL)
322                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
323                         endif()
324                         if(DEFINED GETTEXT_ICONV_DLL)
325                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
326                         endif()
327                 endif(USE_GETTEXT)
328         endif()
329 endif(BUILD_CLIENT)
330
331 if(BUILD_SERVER)
332         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
333 endif(BUILD_SERVER)
334
335 if (USE_GETTEXT)
336         set(MO_FILES)
337
338         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
339                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
340                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
341                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
342
343                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
344                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
345                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
346
347                 add_custom_command(
348                         OUTPUT ${MO_FILE_PATH}
349                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
350                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
351                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
352                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
353                         )
354
355                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
356         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
357
358         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
359 endif(USE_GETTEXT)
360
361 # Subdirectories
362
363 if (JTHREAD_FOUND)
364 else (JTHREAD_FOUND)
365         add_subdirectory(jthread)
366 endif (JTHREAD_FOUND)
367
368 if (SQLITE3_FOUND)
369 else (SQLITE3_FOUND)
370         add_subdirectory(sqlite)
371 endif (SQLITE3_FOUND)
372
373 if (LUA_FOUND)
374 else (LUA_FOUND)
375         add_subdirectory(lua)
376 endif (LUA_FOUND)
377
378 #end