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