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