Add OPENAL_DLL LIBOGG_DLL LIBVORBIS_DLL and LIBVORBISFILE_DLL to be used optionally...
[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.")
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         if(ENABLE_SOUND)
110                 set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)")
111                 set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)")
112                 set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)")
113                 set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)")
114         endif()
115 else()
116         # Unix probably
117         if(BUILD_CLIENT)
118                 find_package(X11 REQUIRED)
119                 find_package(OpenGL REQUIRED)
120                 find_package(JPEG REQUIRED)
121                 find_package(BZip2 REQUIRED)
122                 find_package(PNG REQUIRED)
123                 if(APPLE)
124                         FIND_LIBRARY(CARBON_LIB Carbon)
125                         FIND_LIBRARY(COCOA_LIB Cocoa)
126                         FIND_LIBRARY(IOKIT_LIB IOKit)
127                         mark_as_advanced(
128                                 CARBON_LIB
129                                 COCOA_LIB
130                                 IOKIT_LIB
131                         )
132                         SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB})
133                 endif(APPLE)
134         endif(BUILD_CLIENT)
135         find_package(ZLIB REQUIRED)
136         set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS})
137         #set(CLIENT_PLATFORM_LIBS -lXxf86vm)
138         # This way Xxf86vm is found on OpenBSD too
139         find_library(XXF86VM_LIBRARY Xxf86vm)
140         set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY})
141 endif()
142
143 find_package(Jthread REQUIRED)
144 find_package(Sqlite3 REQUIRED)
145
146 # TODO: Create proper find script for Lua
147 set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
148 set(LUA_LIBRARY "lua")
149
150 configure_file(
151         "${PROJECT_SOURCE_DIR}/cmake_config.h.in"
152         "${PROJECT_BINARY_DIR}/cmake_config.h"
153 )
154
155 set(common_SRCS
156         sound.cpp
157         quicktune.cpp
158         subgame.cpp
159         inventorymanager.cpp
160         mods.cpp
161         serverremoteplayer.cpp
162         content_abm.cpp
163         craftdef.cpp
164         nameidmapping.cpp
165         itemdef.cpp
166         nodedef.cpp
167         luaentity_common.cpp
168         scriptapi.cpp
169         script.cpp
170         log.cpp
171         content_sao.cpp
172         mapgen.cpp
173         content_nodemeta.cpp
174         content_mapnode.cpp
175         auth.cpp
176         collision.cpp
177         nodemetadata.cpp
178         serverobject.cpp
179         noise.cpp
180         porting.cpp
181         tool.cpp
182         defaultsettings.cpp
183         mapnode.cpp
184         voxel.cpp
185         inventory.cpp
186         debug.cpp
187         serialization.cpp
188         light.cpp
189         filesys.cpp
190         connection.cpp
191         environment.cpp
192         server.cpp
193         servercommand.cpp
194         socket.cpp
195         mapblock.cpp
196         mapsector.cpp
197         map.cpp
198         player.cpp
199         utility.cpp
200         test.cpp
201         sha1.cpp
202         base64.cpp
203         ban.cpp
204 )
205
206 # This gives us the icon
207 if(WIN32)
208         if(MINGW)
209                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
210                         COMMAND windres.exe -I${CMAKE_CURRENT_SOURCE_DIR}
211                         -i${CMAKE_CURRENT_SOURCE_DIR}/winresource.rc
212                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
213                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
214         else(MINGW) # Probably MSVC
215                 set(common_SRCS ${common_SRCS} winresource.rc)
216         endif(MINGW)
217 endif()
218
219 # Client sources
220 set(minetest_SRCS
221         ${common_SRCS}
222         ${sound_SRCS}
223         sky.cpp
224         clientmap.cpp
225         content_cso.cpp
226         content_mapblock.cpp
227         content_cao.cpp
228         mesh.cpp
229         mapblock_mesh.cpp
230         farmesh.cpp
231         keycode.cpp
232         camera.cpp
233         clouds.cpp
234         clientobject.cpp
235         chat.cpp
236         guiMainMenu.cpp
237         guiKeyChangeMenu.cpp
238         guiMessageMenu.cpp
239         guiTextInputMenu.cpp
240         guiInventoryMenu.cpp
241         guiPauseMenu.cpp
242         guiPasswordChange.cpp
243         guiDeathScreen.cpp
244         guiChatConsole.cpp
245         guiCreateWorld.cpp
246         guiConfirmMenu.cpp
247         client.cpp
248         filecache.cpp
249         tile.cpp
250         game.cpp
251         main.cpp
252 )
253
254 # Server sources
255 set(minetestserver_SRCS
256         ${common_SRCS}
257         main.cpp
258 )
259
260 include_directories(
261         ${PROJECT_BINARY_DIR}
262         ${IRRLICHT_INCLUDE_DIR}
263         ${ZLIB_INCLUDE_DIR}
264         ${CMAKE_BUILD_TYPE}
265         ${PNG_INCLUDE_DIR}
266         ${GETTEXT_INCLUDE_DIR}
267         ${SOUND_INCLUDE_DIRS}
268         ${JTHREAD_INCLUDE_DIR}
269         ${SQLITE3_INCLUDE_DIR}
270         ${LUA_INCLUDE_DIR}
271 )
272
273 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
274
275 if(BUILD_CLIENT)
276         add_executable(${PROJECT_NAME} ${minetest_SRCS})
277         target_link_libraries(
278                 ${PROJECT_NAME}
279                 ${ZLIB_LIBRARIES}
280                 ${IRRLICHT_LIBRARY}
281                 ${OPENGL_LIBRARIES}
282                 ${JPEG_LIBRARIES}
283                 ${BZIP2_LIBRARIES}
284                 ${PNG_LIBRARIES}
285                 ${X11_LIBRARIES}
286                 ${GETTEXT_LIBRARY}
287                 ${SOUND_LIBRARIES}
288                 ${JTHREAD_LIBRARY}
289                 ${SQLITE3_LIBRARY}
290                 ${LUA_LIBRARY}
291                 ${PLATFORM_LIBS}
292                 ${CLIENT_PLATFORM_LIBS}
293         )
294 endif(BUILD_CLIENT)
295
296 if(BUILD_SERVER)
297         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
298         target_link_libraries(
299                 ${PROJECT_NAME}server
300                 ${ZLIB_LIBRARIES}
301                 ${JTHREAD_LIBRARY}
302                 ${SQLITE3_LIBRARY}
303                 ${LUA_LIBRARY}
304                 ${PLATFORM_LIBS}
305         )
306 endif(BUILD_SERVER)
307
308 #
309 # Set some optimizations and tweaks
310 #
311
312 include(CheckCXXCompilerFlag)
313
314 if(MSVC)
315         # Visual Studio
316
317         # EHa enables SEH exceptions (used for catching segfaults)
318         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")
319         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
320         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
321
322         # Debug build doesn't catch exceptions by itself
323         # Add some optimizations because otherwise it's VERY slow
324         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
325
326         # Flags for C files (sqlite)
327         # /MT = Link statically with standard library stuff
328         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
329         
330         if(BUILD_SERVER)
331                 set_target_properties(${PROJECT_NAME}server PROPERTIES
332                                 COMPILE_DEFINITIONS "SERVER")
333         endif(BUILD_SERVER)
334
335 else()
336         # Probably GCC
337         
338         if(WARN_ALL)
339                 set(RELEASE_WARNING_FLAGS "-Wall")
340         else()
341                 set(RELEASE_WARNING_FLAGS "")
342         endif()
343         
344         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
345                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
346                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
347                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
348                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
349         endif()
350         
351         if(APPLE)
352                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
353                 set(ARCH i386)
354         endif()
355
356         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
357         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS}")
358
359         if(USE_GPROF)
360                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
361         endif()
362         
363         if(BUILD_SERVER)
364                 set_target_properties(${PROJECT_NAME}server PROPERTIES
365                                 COMPILE_DEFINITIONS "SERVER")
366         endif(BUILD_SERVER)
367
368 endif()
369
370 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
371 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
372
373 #
374 # Installation
375 #
376 if(WIN32)
377         if(DEFINED ZLIB_DLL)
378                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
379         endif()
380         if(USE_SOUND)
381                 if(OPENAL_DLL)
382                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
383                 endif()
384                 if(OGG_DLL)
385                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
386                 endif()
387                 if(VORBIS_DLL)
388                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
389                 endif()
390                 if(VORBISFILE_DLL)
391                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
392                 endif()
393         endif()
394 endif()
395
396 if(BUILD_CLIENT)
397         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
398
399         if(USE_GETTEXT)
400                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
401                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
402                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
403                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
404                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
405         endif()
406
407         if(WIN32)
408                 if(DEFINED IRRLICHT_DLL)
409                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
410                 endif()
411                 if(USE_GETTEXT)
412                         if(DEFINED GETTEXT_DLL)
413                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
414                         endif()
415                         if(DEFINED GETTEXT_ICONV_DLL)
416                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
417                         endif()
418                 endif(USE_GETTEXT)
419         endif()
420 endif(BUILD_CLIENT)
421
422 if(BUILD_SERVER)
423         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
424 endif(BUILD_SERVER)
425
426 if (USE_GETTEXT)
427         set(MO_FILES)
428
429         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
430                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
431                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
432                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
433
434                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
435                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
436                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
437
438                 add_custom_command(
439                         OUTPUT ${MO_FILE_PATH}
440                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
441                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
442                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
443                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
444                         )
445
446                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
447         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
448
449         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
450 endif(USE_GETTEXT)
451
452 # Subdirectories
453
454 if (JTHREAD_FOUND)
455 else (JTHREAD_FOUND)
456         add_subdirectory(jthread)
457 endif (JTHREAD_FOUND)
458
459 if (SQLITE3_FOUND)
460 else (SQLITE3_FOUND)
461         add_subdirectory(sqlite)
462 endif (SQLITE3_FOUND)
463
464 if (LUA_FOUND)
465 else (LUA_FOUND)
466         add_subdirectory(lua)
467 endif (LUA_FOUND)
468
469 #end