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