0c4b418293800d4a239e28f427ae280b34f7a824
[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 if(USE_GETTEXT)
9         find_package(GettextLib REQUIRED)
10         message(STATUS "gettext include path: ${GETTEXT_INCLUDE_DIR}")
11         message(STATUS "gettext msgfmt path: ${GETTEXT_MSGFMT}")
12         if(WIN32)
13                 message(STATUS "gettext library: ${GETTEXT_LIBRARY}")
14                 message(STATUS "gettext dll: ${GETTEXT_DLL}")
15                 message(STATUS "gettext iconv dll: ${GETTEXT_ICONV_DLL}")
16         endif()
17         if (GETTEXT_FOUND)
18                 add_definitions( -DUSE_GETTEXT )
19                 message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
20         else()
21                 message(STATUS "ERROR: GetText enabled but not found, disabling")
22                 set(USE_GETTEXT FALSE)
23         endif(GETTEXT_FOUND)
24 else(USE_GETTEXT)
25         message(STATUS "GetText disabled")
26 endif(USE_GETTEXT)
27
28 if(NOT MSVC)
29         set(USE_GPROF 0 CACHE BOOL "Use -pg flag for g++")
30 endif()
31
32 # Use cmake_config.h
33 add_definitions ( -DUSE_CMAKE_CONFIG_H )
34
35 if(WIN32)
36         # Windows
37         if(MSVC) # MSVC Specifics
38                 # Surpress some useless warnings
39                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
40         else() # Probably MinGW = GCC
41                 set(PLATFORM_LIBS ws2_32.lib)
42         endif()
43         # Zlib stuff
44         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
45                         CACHE PATH "Zlib include directory")
46         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
47                         CACHE FILEPATH "Path to zlibwapi.lib")
48         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
49                         CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
50         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
51                         CACHE PATH "irrlicht dir")
52 else()
53         # Unix probably
54         if(BUILD_CLIENT)
55                 find_package(X11 REQUIRED)
56                 find_package(OpenGL REQUIRED)
57                 find_package(JPEG REQUIRED)
58                 find_package(BZip2 REQUIRED)
59                 find_package(PNG REQUIRED)
60                 if(APPLE)
61                         FIND_LIBRARY(CARBON_LIB Carbon)
62                         FIND_LIBRARY(COCOA_LIB Cocoa)
63                         FIND_LIBRARY(IOKIT_LIB IOKit)
64                         mark_as_advanced(
65                                 CARBON_LIB
66                                 COCOA_LIB
67                                 IOKIT_LIB
68                         )
69                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
70                 endif(APPLE)
71         endif(BUILD_CLIENT)
72         find_package(ZLIB REQUIRED)
73         set(PLATFORM_LIBS -lpthread)
74         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
75         # This way Xxf86vm is found on OpenBSD too
76         find_library(XXF86VM_LIBRARY Xxf86vm)
77         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
78 endif()
79
80 find_package(Jthread REQUIRED)
81 find_package(Sqlite3 REQUIRED)
82
83 configure_file(
84         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
85         "${PROJECT_BINARY_DIR}/cmake_config.h"
86 )
87
88 set(common_SRCS
89         content_sao.cpp
90         mapgen.cpp
91         content_inventory.cpp
92         content_nodemeta.cpp
93         content_craft.cpp
94         content_mapblock.cpp
95         content_mapnode.cpp
96         auth.cpp
97         collision.cpp
98         nodemetadata.cpp
99         serverobject.cpp
100         noise.cpp
101         mineral.cpp
102         porting.cpp
103         materials.cpp
104         defaultsettings.cpp
105         mapnode.cpp
106         voxel.cpp
107         mapblockobject.cpp
108         inventory.cpp
109         debug.cpp
110         serialization.cpp
111         light.cpp
112         filesys.cpp
113         connection.cpp
114         environment.cpp
115         server.cpp
116         servercommand.cpp
117         socket.cpp
118         mapblock.cpp
119         mapsector.cpp
120         map.cpp
121         player.cpp
122         utility.cpp
123         test.cpp
124         sha1.cpp
125         base64.cpp
126 )
127
128 # Client sources
129 set(minetest_SRCS
130         ${common_SRCS}
131         content_cao.cpp
132         mapblock_mesh.cpp
133         farmesh.cpp
134         keycode.cpp
135         clouds.cpp
136         clientobject.cpp
137         guiMainMenu.cpp
138         guiKeyChangeMenu.cpp
139         guiMessageMenu.cpp
140         guiTextInputMenu.cpp
141         guiInventoryMenu.cpp
142         guiPauseMenu.cpp
143         guiPasswordChange.cpp
144         client.cpp
145         tile.cpp
146         game.cpp
147         main.cpp
148 )
149
150 # Server sources
151 set(minetestserver_SRCS
152         ${common_SRCS}
153         servermain.cpp
154 )
155
156 include_directories(
157         ${PROJECT_BINARY_DIR}
158         ${IRRLICHT_INCLUDE_DIR}
159         ${ZLIB_INCLUDE_DIR}
160         ${CMAKE_BUILD_TYPE}
161         ${PNG_INCLUDE_DIR}
162         ${GETTEXT_INCLUDE_DIR}
163         ${JTHREAD_INCLUDE_DIR}
164         ${SQLITE3_INCLUDE_DIR}
165 )
166
167 set(EXECUTABLE_OUTPUT_PATH ../bin)
168
169 if(BUILD_CLIENT)
170         add_executable(${PROJECT_NAME} ${minetest_SRCS})
171         target_link_libraries(
172                 ${PROJECT_NAME}
173                 ${ZLIB_LIBRARIES}
174                 ${IRRLICHT_LIBRARY}
175                 ${OPENGL_LIBRARIES}
176                 ${JPEG_LIBRARIES}
177                 ${BZIP2_LIBRARIES}
178                 ${PNG_LIBRARIES}
179                 ${X11_LIBRARIES}
180                 ${GETTEXT_LIBRARY}
181                 ${PLATFORM_LIBS}
182                 ${CLIENT_PLATFORM_LIBS}
183                 ${JTHREAD_LIBRARY}
184                 ${SQLITE3_LIBRARY}
185         )
186 endif(BUILD_CLIENT)
187
188 if(BUILD_SERVER)
189         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
190         target_link_libraries(
191                 ${PROJECT_NAME}server
192                 ${ZLIB_LIBRARIES}
193                 ${PLATFORM_LIBS}
194                 ${JTHREAD_LIBRARY}
195                 ${SQLITE3_LIBRARY}
196         )
197 endif(BUILD_SERVER)
198
199 #
200 # Set some optimizations and tweaks
201 #
202
203 if(MSVC)
204         # Visual Studio
205
206         # EHa enables SEH exceptions (used for catching segfaults)
207         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")
208         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
209         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
210
211         # Debug build doesn't catch exceptions by itself
212         # Add some optimizations because otherwise it's VERY slow
213         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
214         
215         if(BUILD_SERVER)
216                 set_target_properties(${PROJECT_NAME}server PROPERTIES
217                                 COMPILE_DEFINITIONS "SERVER")
218         endif(BUILD_SERVER)
219
220 else()
221         # Probably GCC
222         
223         if(WARN_ALL)
224                 set(RELEASE_WARNING_FLAGS "-Wall")
225         else()
226                 set(RELEASE_WARNING_FLAGS "")
227         endif()
228         
229         if(NOT APPLE)
230                 set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
231         endif()
232         
233         if(APPLE)
234                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
235                 set(ARCH i386)
236         endif()
237
238         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
239         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS}")
240
241         if(USE_GPROF)
242                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
243         endif()
244         
245         if(BUILD_SERVER)
246                 set_target_properties(${PROJECT_NAME}server PROPERTIES
247                                 COMPILE_DEFINITIONS "SERVER")
248         endif(BUILD_SERVER)
249
250 endif()
251
252 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
253 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
254
255 #
256 # Installation
257 #
258
259 # Example configuration file
260 install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../minetest.conf.example" DESTINATION ${EXAMPLE_CONF_DIR})
261
262 if(BUILD_CLIENT)
263         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
264
265         file(GLOB images "${CMAKE_CURRENT_SOURCE_DIR}/../data/*.png")
266
267         install(FILES ${images} DESTINATION ${DATADIR})
268
269         if (USE_GETTEXT)
270                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
271                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
272                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
273                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
274                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
275         endif()
276
277         if(WIN32)
278                 if(DEFINED IRRLICHT_DLL)
279                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
280                 endif()
281                 if(DEFINED ZLIB_DLL)
282                         install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
283                 endif()
284                 if(USE_GETTEXT)
285                         if(DEFINED GETTEXT_DLL)
286                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
287                         endif()
288                         if(DEFINED GETTEXT_ICONV_DLL)
289                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
290                         endif()
291                 endif(USE_GETTEXT)
292         endif()
293 endif(BUILD_CLIENT)
294
295 if(BUILD_SERVER)
296         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
297 endif(BUILD_SERVER)
298
299 if (USE_GETTEXT)
300         add_custom_command(OUTPUT "${GETTEXT_PO_PATH}/en"
301                 COMMAND ${CMAKE_COMMAND} -E make_directory "${GETTEXT_PO_PATH}/en"
302                 COMMENT "po-update [en]: creating translation template base directory")
303         set(POT_FILE "${GETTEXT_PO_PATH}/en/minetest.pot")
304         file(GLOB GETTEXT_POT_DEPS *.cpp *.h)
305         file(GLOB GETTEXT_POT_DEPS_REL RELATIVE ${CMAKE_SOURCE_DIR} *.cpp *.h)
306         add_custom_command(OUTPUT ${POT_FILE}
307                 COMMAND ${GETTEXT_EXTRACT} -F -n -o ${POT_FILE} ${GETTEXT_POT_DEPS_REL}
308                 DEPENDS "${GETTEXT_PO_PATH}/en" ${GETTEXT_POT_DEPS}
309                 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
310                 COMMENT "po-update [en]: updating translation template")
311
312         set(PO_FILES)
313         set(MO_FILES)
314
315         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
316                 # skip the 'en' locale which is treated separately
317                 if (NOT LOCALE STREQUAL "en")
318                         set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
319                         add_custom_command(OUTPUT ${PO_FILE_PATH}
320                                 COMMAND ${GETTEXT_MSGMERGE} -F -U ${PO_FILE_PATH} ${POT_FILE}
321                                 DEPENDS ${POT_FILE}
322                                 WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
323                                 COMMENT "po-update [${LOCALE}]: updating strings")
324
325
326                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
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                         set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
332
333                         add_custom_command(
334                                 OUTPUT ${MO_FILE_PATH}
335                                 COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
336                                 DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
337                                 WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
338                                 COMMENT "mo-update [${LOCALE}]: Creating mo file."
339                                 )
340
341                         set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
342                         set(PO_FILES ${PO_FILES} ${PO_FILE_PATH})
343                 endif(NOT LOCALE STREQUAL "en")
344         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
345
346         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
347         add_custom_target(updatepo COMMENT "po update" DEPENDS ${PO_FILES})
348 endif(USE_GETTEXT)
349
350 # Subdirectories
351
352 if (JTHREAD_FOUND)
353 else (JTHREAD_FOUND)
354         add_subdirectory(jthread)
355 endif (JTHREAD_FOUND)
356
357 if (SQLITE3_FOUND)
358 else (SQLITE3_FOUND)
359 add_subdirectory(sqlite)
360 endif (SQLITE3_FOUND)
361
362 #end