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