Fix buildbot
[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 # Set some random things default to not being visible in the GUI
9 mark_as_advanced(EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH)
10 mark_as_advanced(JTHREAD_INCLUDE_DIR JTHREAD_LIBRARY)
11 mark_as_advanced(SQLITE3_INCLUDE_DIR SQLITE3_LIBRARY)
12
13 # user-visible option to enable/disable gettext usage
14 OPTION(ENABLE_GETTEXT "Use GetText for internationalization" 0)
15
16 # this is only set to 1 if gettext is enabled _and_ available
17 set(USE_GETTEXT 0)
18
19 if(ENABLE_GETTEXT)
20         find_package(GettextLib)
21 else()
22         MARK_AS_ADVANCED(GETTEXT_ICONV_DLL GETTEXT_INCLUDE_DIR GETTEXT_LIBRARY GETTEXT_MSGFMT)
23 endif()
24
25 if(GETTEXT_FOUND AND ENABLE_GETTEXT)
26         message(STATUS "gettext include path: ${GETTEXT_INCLUDE_DIR}")
27         message(STATUS "gettext msgfmt path: ${GETTEXT_MSGFMT}")
28         if(WIN32)
29                 message(STATUS "gettext library: ${GETTEXT_LIBRARY}")
30                 message(STATUS "gettext dll: ${GETTEXT_DLL}")
31                 message(STATUS "gettext iconv dll: ${GETTEXT_ICONV_DLL}")
32         endif()
33         set(USE_GETTEXT 1)
34         message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}")
35 elseif(GETTEXT_FOUND AND NOT ENABLE_GETTEXT)
36         MESSAGE(STATUS "GetText found but disabled;")
37 else(GETTEXT_FOUND AND ENABLE_GETTEXT)
38         message(STATUS "GetText disabled")
39 endif(GETTEXT_FOUND AND ENABLE_GETTEXT)
40
41 # user visible option to enable/disable sound
42 OPTION(ENABLE_SOUND "Enable sound" ON)
43
44 # this is only set to 1 if sound is enabled _and_ available
45 set(USE_SOUND 0)
46 set(SOUND_PROBLEM 0)
47
48 if(ENABLE_SOUND AND BUILD_CLIENT)
49         # Sound libraries
50         find_package(OpenAL)
51         find_package(Vorbis)
52         if(NOT OPENAL_FOUND)
53                 message(STATUS "Sound enabled, but OpenAL not found!")
54                 set(SOUND_PROBLEM 1)
55                 MARK_AS_ADVANCED(CLEAR OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
56         endif()
57         if(NOT VORBIS_FOUND)
58                 message(STATUS "Sound enabled, but Vorbis libraries not found!")
59                 set(SOUND_PROBLEM 1)
60                 MARK_AS_ADVANCED(CLEAR OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)
61         endif()
62         if(OPENAL_FOUND AND VORBIS_FOUND)
63                 set(USE_SOUND 1)
64                 message(STATUS "Sound enabled")
65         endif()
66 endif(ENABLE_SOUND AND BUILD_CLIENT)
67
68 if(SOUND_PROBLEM)
69         message(FATAL_ERROR "Sound enabled, but cannot be used.\n"
70                 "To continue, either fill in the required paths or disable sound. (-DENABLE_SOUND=0)")
71 endif()
72 if(USE_SOUND)
73         set(sound_SRCS sound_openal.cpp)
74         set(SOUND_INCLUDE_DIRS
75                 ${OPENAL_INCLUDE_DIR}
76                 ${VORBIS_INCLUDE_DIR}
77                 ${OGG_INCLUDE_DIR}
78                 )
79         set(SOUND_LIBRARIES
80                 ${OPENAL_LIBRARY}
81                 ${VORBIS_LIBRARIES}
82                 )
83 endif()
84
85 if(NOT MSVC)
86         set(USE_GPROF 0 CACHE BOOL "Use -pg flag for g++")
87 endif()
88
89 # Use cmake_config.h
90 add_definitions ( -DUSE_CMAKE_CONFIG_H )
91
92 if(WIN32)
93         # Windows
94         if(MSVC) # MSVC Specifics
95                 # Surpress some useless warnings
96                 add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
97         else() # Probably MinGW = GCC
98                 set(PLATFORM_LIBS ws2_32.lib)
99         endif()
100         # Zlib stuff
101         set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
102                         CACHE PATH "Zlib include directory")
103         set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
104                         CACHE FILEPATH "Path to zlibwapi.lib")
105         set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
106                         CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
107         set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
108                         CACHE PATH "irrlicht dir")
109         set(MINGWM10_DLL ""
110                         CACHE FILEPATH "Path to mingwm10.dll (for installation)")
111         if(ENABLE_SOUND)
112                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
113                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
114                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
115                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
116         endif()
117 else()
118         # Unix probably
119         if(BUILD_CLIENT)
120                 find_package(X11 REQUIRED)
121                 find_package(OpenGL REQUIRED)
122                 find_package(JPEG REQUIRED)
123                 find_package(BZip2 REQUIRED)
124                 find_package(PNG REQUIRED)
125                 if(APPLE)
126                         FIND_LIBRARY(CARBON_LIB Carbon)
127                         FIND_LIBRARY(COCOA_LIB Cocoa)
128                         FIND_LIBRARY(IOKIT_LIB IOKit)
129                         mark_as_advanced(
130                                 CARBON_LIB
131                                 COCOA_LIB
132                                 IOKIT_LIB
133                         )
134                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
135                 endif(APPLE)
136         endif(BUILD_CLIENT)
137         find_package(ZLIB REQUIRED)
138         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
139         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
140         # This way Xxf86vm is found on OpenBSD too
141         find_library(XXF86VM_LIBRARY Xxf86vm)
142         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
143 endif()
144
145 find_package(Jthread REQUIRED)
146 find_package(Sqlite3 REQUIRED)
147
148 # TODO: Create proper find script for Lua
149 set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
150 set(LUA_LIBRARY "lua")
151
152 configure_file(
153         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
154         "${PROJECT_BINARY_DIR}/cmake_config.h"
155 )
156
157 set(common_SRCS
158         genericobject.cpp
159         voxelalgorithms.cpp
160         sound.cpp
161         quicktune.cpp
162         subgame.cpp
163         inventorymanager.cpp
164         mods.cpp
165         content_abm.cpp
166         craftdef.cpp
167         nameidmapping.cpp
168         itemdef.cpp
169         nodedef.cpp
170         object_properties.cpp
171         scriptapi.cpp
172         script.cpp
173         log.cpp
174         content_sao.cpp
175         mapgen.cpp
176         content_nodemeta.cpp
177         content_mapnode.cpp
178         collision.cpp
179         nodemetadata.cpp
180         serverobject.cpp
181         noise.cpp
182         porting.cpp
183         tool.cpp
184         defaultsettings.cpp
185         mapnode.cpp
186         voxel.cpp
187         inventory.cpp
188         debug.cpp
189         serialization.cpp
190         light.cpp
191         filesys.cpp
192         connection.cpp
193         environment.cpp
194         server.cpp
195         servercommand.cpp
196         socket.cpp
197         mapblock.cpp
198         mapsector.cpp
199         map.cpp
200         player.cpp
201         utility.cpp
202         test.cpp
203         sha1.cpp
204         base64.cpp
205         ban.cpp
206 )
207
208 # This gives us the icon
209 if(WIN32)
210         set(WINRESOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc)
211         if(MINGW)
212                 if(NOT CMAKE_RC_COMPILER)
213                         set(CMAKE_RC_COMPILER "windres.exe")
214                 endif()
215                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
216                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR}
217                         -i${WINRESOURCE_FILE}
218                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
219                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
220                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
221         else(MINGW) # Probably MSVC
222                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
223         endif(MINGW)
224 endif()
225
226 # Client sources
227 set(minetest_SRCS
228         ${common_SRCS}
229         ${sound_SRCS}
230         localplayer.cpp
231         sky.cpp
232         clientmap.cpp
233         content_cso.cpp
234         content_mapblock.cpp
235         content_cao.cpp
236         mesh.cpp
237         mapblock_mesh.cpp
238         farmesh.cpp
239         keycode.cpp
240         camera.cpp
241         clouds.cpp
242         clientobject.cpp
243         chat.cpp
244         guiMainMenu.cpp
245         guiKeyChangeMenu.cpp
246         guiMessageMenu.cpp
247         guiTextInputMenu.cpp
248         guiInventoryMenu.cpp
249         guiPauseMenu.cpp
250         guiPasswordChange.cpp
251         guiDeathScreen.cpp
252         guiChatConsole.cpp
253         guiCreateWorld.cpp
254         guiConfirmMenu.cpp
255         client.cpp
256         filecache.cpp
257         tile.cpp
258         game.cpp
259         main.cpp
260 )
261
262 # Server sources
263 set(minetestserver_SRCS
264         ${common_SRCS}
265         main.cpp
266 )
267
268 include_directories(
269         ${PROJECT_BINARY_DIR}
270         ${IRRLICHT_INCLUDE_DIR}
271         ${ZLIB_INCLUDE_DIR}
272         ${CMAKE_BUILD_TYPE}
273         ${PNG_INCLUDE_DIR}
274         ${GETTEXT_INCLUDE_DIR}
275         ${SOUND_INCLUDE_DIRS}
276         ${JTHREAD_INCLUDE_DIR}
277         ${SQLITE3_INCLUDE_DIR}
278         ${LUA_INCLUDE_DIR}
279 )
280
281 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
282
283 if(BUILD_CLIENT)
284         add_executable(${PROJECT_NAME} ${minetest_SRCS})
285         target_link_libraries(
286                 ${PROJECT_NAME}
287                 ${ZLIB_LIBRARIES}
288                 ${IRRLICHT_LIBRARY}
289                 ${OPENGL_LIBRARIES}
290                 ${JPEG_LIBRARIES}
291                 ${BZIP2_LIBRARIES}
292                 ${PNG_LIBRARIES}
293                 ${X11_LIBRARIES}
294                 ${GETTEXT_LIBRARY}
295                 ${SOUND_LIBRARIES}
296                 ${JTHREAD_LIBRARY}
297                 ${SQLITE3_LIBRARY}
298                 ${LUA_LIBRARY}
299                 ${PLATFORM_LIBS}
300                 ${CLIENT_PLATFORM_LIBS}
301         )
302 endif(BUILD_CLIENT)
303
304 if(BUILD_SERVER)
305         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
306         target_link_libraries(
307                 ${PROJECT_NAME}server
308                 ${ZLIB_LIBRARIES}
309                 ${JTHREAD_LIBRARY}
310                 ${SQLITE3_LIBRARY}
311                 ${LUA_LIBRARY}
312                 ${PLATFORM_LIBS}
313         )
314 endif(BUILD_SERVER)
315
316 #
317 # Set some optimizations and tweaks
318 #
319
320 include(CheckCXXCompilerFlag)
321
322 if(MSVC)
323         # Visual Studio
324
325         # EHa enables SEH exceptions (used for catching segfaults)
326         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")
327         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
328         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
329
330         # Debug build doesn't catch exceptions by itself
331         # Add some optimizations because otherwise it's VERY slow
332         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
333
334         # Flags for C files (sqlite)
335         # /MT = Link statically with standard library stuff
336         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
337         
338         if(BUILD_SERVER)
339                 set_target_properties(${PROJECT_NAME}server PROPERTIES
340                                 COMPILE_DEFINITIONS "SERVER")
341         endif(BUILD_SERVER)
342
343 else()
344         # Probably GCC
345         
346         if(WARN_ALL)
347                 set(RELEASE_WARNING_FLAGS "-Wall")
348         else()
349                 set(RELEASE_WARNING_FLAGS "")
350         endif()
351         
352         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
353                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
354                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
355                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
356                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
357         endif()
358
359         if(MINGW)
360                 set(OTHER_FLAGS "-mthreads -fexceptions")
361         endif()
362
363         if(APPLE)
364                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
365                 set(ARCH i386)
366         endif()
367
368         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
369         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}")
370
371         if(USE_GPROF)
372                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
373         endif()
374         
375         if(BUILD_SERVER)
376                 set_target_properties(${PROJECT_NAME}server PROPERTIES
377                                 COMPILE_DEFINITIONS "SERVER")
378         endif(BUILD_SERVER)
379
380 endif()
381
382 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
383 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
384
385 #
386 # Installation
387 #
388 if(WIN32)
389         if(MINGWM10_DLL)
390                 install(FILES ${MINGWM10_DLL} DESTINATION ${BINDIR})
391         endif()
392         if(DEFINED ZLIB_DLL)
393                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
394         endif()
395         if(USE_SOUND)
396                 if(OPENAL_DLL)
397                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
398                 endif()
399                 if(OGG_DLL)
400                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
401                 endif()
402                 if(VORBIS_DLL)
403                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
404                 endif()
405                 if(VORBISFILE_DLL)
406                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
407                 endif()
408         endif()
409 endif()
410
411 if(BUILD_CLIENT)
412         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
413
414         if(USE_GETTEXT)
415                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
416                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
417                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
418                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
419                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
420         endif()
421
422         if(WIN32)
423                 if(DEFINED IRRLICHT_DLL)
424                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
425                 endif()
426                 if(USE_GETTEXT)
427                         if(DEFINED GETTEXT_DLL)
428                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
429                         endif()
430                         if(DEFINED GETTEXT_ICONV_DLL)
431                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
432                         endif()
433                 endif(USE_GETTEXT)
434         endif()
435 endif(BUILD_CLIENT)
436
437 if(BUILD_SERVER)
438         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
439 endif(BUILD_SERVER)
440
441 if (USE_GETTEXT)
442         set(MO_FILES)
443
444         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
445                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
446                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
447                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
448
449                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
450                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
451                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
452
453                 add_custom_command(
454                         OUTPUT ${MO_FILE_PATH}
455                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
456                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
457                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
458                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
459                         )
460
461                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
462         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
463
464         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
465 endif(USE_GETTEXT)
466
467 # Subdirectories
468
469 if (JTHREAD_FOUND)
470 else (JTHREAD_FOUND)
471         add_subdirectory(jthread)
472 endif (JTHREAD_FOUND)
473
474 if (SQLITE3_FOUND)
475 else (SQLITE3_FOUND)
476         add_subdirectory(sqlite)
477 endif (SQLITE3_FOUND)
478
479 if (LUA_FOUND)
480 else (LUA_FOUND)
481         add_subdirectory(lua)
482 endif (LUA_FOUND)
483
484 #end