Merge remote-tracking branch 'queatz/mmb10'
[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)
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         ban.cpp
131 )
132
133 # This gives us the icon
134 if(WIN32 AND MSVC)
135         set(common_SRCS ${common_SRCS} winresource.rc)
136 endif()
137
138 # Client sources
139 set(minetest_SRCS
140         ${common_SRCS}
141         content_cao.cpp
142         mapblock_mesh.cpp
143         farmesh.cpp
144         keycode.cpp
145         clouds.cpp
146         clientobject.cpp
147         guiMainMenu.cpp
148         guiKeyChangeMenu.cpp
149         guiMessageMenu.cpp
150         guiTextInputMenu.cpp
151         guiInventoryMenu.cpp
152         guiPauseMenu.cpp
153         guiPasswordChange.cpp
154         client.cpp
155         tile.cpp
156         game.cpp
157         main.cpp
158 )
159
160 # Server sources
161 set(minetestserver_SRCS
162         ${common_SRCS}
163         servermain.cpp
164 )
165
166 include_directories(
167         ${PROJECT_BINARY_DIR}
168         ${IRRLICHT_INCLUDE_DIR}
169         ${ZLIB_INCLUDE_DIR}
170         ${CMAKE_BUILD_TYPE}
171         ${PNG_INCLUDE_DIR}
172         ${GETTEXT_INCLUDE_DIR}
173         ${JTHREAD_INCLUDE_DIR}
174         ${SQLITE3_INCLUDE_DIR}
175 )
176
177 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
178
179 if(BUILD_CLIENT)
180         add_executable(${PROJECT_NAME} ${minetest_SRCS})
181         target_link_libraries(
182                 ${PROJECT_NAME}
183                 ${ZLIB_LIBRARIES}
184                 ${IRRLICHT_LIBRARY}
185                 ${OPENGL_LIBRARIES}
186                 ${JPEG_LIBRARIES}
187                 ${BZIP2_LIBRARIES}
188                 ${PNG_LIBRARIES}
189                 ${X11_LIBRARIES}
190                 ${GETTEXT_LIBRARY}
191                 ${PLATFORM_LIBS}
192                 ${CLIENT_PLATFORM_LIBS}
193                 ${JTHREAD_LIBRARY}
194                 ${SQLITE3_LIBRARY}
195         )
196 endif(BUILD_CLIENT)
197
198 if(BUILD_SERVER)
199         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
200         target_link_libraries(
201                 ${PROJECT_NAME}server
202                 ${ZLIB_LIBRARIES}
203                 ${PLATFORM_LIBS}
204                 ${JTHREAD_LIBRARY}
205                 ${SQLITE3_LIBRARY}
206         )
207 endif(BUILD_SERVER)
208
209 #
210 # Set some optimizations and tweaks
211 #
212
213 include(CheckCXXCompilerFlag)
214
215 if(MSVC)
216         # Visual Studio
217
218         # EHa enables SEH exceptions (used for catching segfaults)
219         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")
220         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
221         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
222
223         # Debug build doesn't catch exceptions by itself
224         # Add some optimizations because otherwise it's VERY slow
225         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
226         
227         if(BUILD_SERVER)
228                 set_target_properties(${PROJECT_NAME}server PROPERTIES
229                                 COMPILE_DEFINITIONS "SERVER")
230         endif(BUILD_SERVER)
231
232 else()
233         # Probably GCC
234         
235         if(WARN_ALL)
236                 set(RELEASE_WARNING_FLAGS "-Wall")
237         else()
238                 set(RELEASE_WARNING_FLAGS "")
239         endif()
240         
241         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
242                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
243                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
244                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
245                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
246         endif()
247         
248         if(APPLE)
249                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
250                 set(ARCH i386)
251         endif()
252
253         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
254         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS}")
255
256         if(USE_GPROF)
257                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
258         endif()
259         
260         if(BUILD_SERVER)
261                 set_target_properties(${PROJECT_NAME}server PROPERTIES
262                                 COMPILE_DEFINITIONS "SERVER")
263         endif(BUILD_SERVER)
264
265 endif()
266
267 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
268 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
269
270 #
271 # Installation
272 #
273
274 # Example configuration file
275 install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../minetest.conf.example" DESTINATION ${EXAMPLE_CONF_DIR})
276
277 if(BUILD_CLIENT)
278         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
279
280         file(GLOB images "${CMAKE_CURRENT_SOURCE_DIR}/../data/*.png")
281
282         install(FILES ${images} DESTINATION ${DATADIR})
283
284         if(USE_GETTEXT)
285                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
286                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
287                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
288                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
289                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
290         endif()
291
292         if(WIN32)
293                 if(DEFINED IRRLICHT_DLL)
294                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
295                 endif()
296                 if(DEFINED ZLIB_DLL)
297                         install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
298                 endif()
299                 if(USE_GETTEXT)
300                         if(DEFINED GETTEXT_DLL)
301                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
302                         endif()
303                         if(DEFINED GETTEXT_ICONV_DLL)
304                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
305                         endif()
306                 endif(USE_GETTEXT)
307         endif()
308 endif(BUILD_CLIENT)
309
310 if(BUILD_SERVER)
311         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
312 endif(BUILD_SERVER)
313
314 if (USE_GETTEXT)
315         set(MO_FILES)
316
317         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
318                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
319                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
320                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
321
322                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
323                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
324                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
325
326                 add_custom_command(
327                         OUTPUT ${MO_FILE_PATH}
328                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
329                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
330                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
331                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
332                         )
333
334                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
335         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
336
337         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
338 endif(USE_GETTEXT)
339
340 # Subdirectories
341
342 if (JTHREAD_FOUND)
343 else (JTHREAD_FOUND)
344         add_subdirectory(jthread)
345 endif (JTHREAD_FOUND)
346
347 if (SQLITE3_FOUND)
348 else (SQLITE3_FOUND)
349 add_subdirectory(sqlite)
350 endif (SQLITE3_FOUND)
351
352 #end