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