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