]> git.lizzy.rs Git - minetest.git/blob - src/CMakeLists.txt
Tweak CMake files for cURL
[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         content_nodemeta.cpp
192         content_mapnode.cpp
193         collision.cpp
194         nodemetadata.cpp
195         nodetimer.cpp
196         serverobject.cpp
197         noise.cpp
198         porting.cpp
199         tool.cpp
200         defaultsettings.cpp
201         mapnode.cpp
202         voxel.cpp
203         inventory.cpp
204         debug.cpp
205         serialization.cpp
206         light.cpp
207         filesys.cpp
208         connection.cpp
209         environment.cpp
210         server.cpp
211         socket.cpp
212         mapblock.cpp
213         mapsector.cpp
214         map.cpp
215         player.cpp
216         test.cpp
217         sha1.cpp
218         base64.cpp
219         ban.cpp
220         clientserver.cpp
221         staticobject.cpp
222         util/serialize.cpp
223         util/directiontables.cpp
224         util/numeric.cpp
225         util/pointedthing.cpp
226         util/string.cpp
227         util/timetaker.cpp
228 )
229
230 # This gives us the icon
231 if(WIN32)
232         set(WINRESOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc)
233         if(MINGW)
234                 if(NOT CMAKE_RC_COMPILER)
235                         set(CMAKE_RC_COMPILER "windres.exe")
236                 endif()
237                 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
238                         COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR}
239                         -i${WINRESOURCE_FILE}
240                         -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
241                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
242                 SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
243         else(MINGW) # Probably MSVC
244                 set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
245         endif(MINGW)
246 endif()
247
248 # Client sources
249 set(minetest_SRCS
250         ${common_SRCS}
251         ${sound_SRCS}
252         localplayer.cpp
253         sky.cpp
254         clientmap.cpp
255         content_cso.cpp
256         content_mapblock.cpp
257         content_cao.cpp
258         mesh.cpp
259         mapblock_mesh.cpp
260         farmesh.cpp
261         keycode.cpp
262         camera.cpp
263         clouds.cpp
264         clientobject.cpp
265         chat.cpp
266         guiMainMenu.cpp
267         guiKeyChangeMenu.cpp
268         guiMessageMenu.cpp
269         guiTextInputMenu.cpp
270         guiFormSpecMenu.cpp
271         guiPauseMenu.cpp
272         guiPasswordChange.cpp
273         guiDeathScreen.cpp
274         guiChatConsole.cpp
275         guiCreateWorld.cpp
276         guiConfirmMenu.cpp
277         client.cpp
278         filecache.cpp
279         tile.cpp
280         shader.cpp
281         game.cpp
282         main.cpp
283 )
284
285 # Server sources
286 set(minetestserver_SRCS
287         ${common_SRCS}
288         main.cpp
289 )
290
291 include_directories(
292         ${PROJECT_BINARY_DIR}
293         ${IRRLICHT_INCLUDE_DIR}
294         ${ZLIB_INCLUDE_DIR}
295         ${CMAKE_BUILD_TYPE}
296         ${PNG_INCLUDE_DIR}
297         ${GETTEXT_INCLUDE_DIR}
298         ${SOUND_INCLUDE_DIRS}
299         ${JTHREAD_INCLUDE_DIR}
300         ${SQLITE3_INCLUDE_DIR}
301         ${LUA_INCLUDE_DIR}
302 )
303
304 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
305
306 if(BUILD_CLIENT)
307         add_executable(${PROJECT_NAME} ${minetest_SRCS})
308         target_link_libraries(
309                 ${PROJECT_NAME}
310                 ${ZLIB_LIBRARIES}
311                 ${IRRLICHT_LIBRARY}
312                 ${OPENGL_LIBRARIES}
313                 ${JPEG_LIBRARIES}
314                 ${BZIP2_LIBRARIES}
315                 ${PNG_LIBRARIES}
316                 ${X11_LIBRARIES}
317                 ${GETTEXT_LIBRARY}
318                 ${SOUND_LIBRARIES}
319                 ${JTHREAD_LIBRARY}
320                 ${SQLITE3_LIBRARY}
321                 ${LUA_LIBRARY}
322                 ${PLATFORM_LIBS}
323                 ${CLIENT_PLATFORM_LIBS}
324         )
325
326         if(USE_CURL)
327                 target_link_libraries(
328                         ${PROJECT_NAME}
329                         ${CURL_LIBRARY}
330                 )
331                 include_directories(
332                         ${CURL_INCLUDE_DIR}
333                 )
334         endif(USE_CURL)
335 endif(BUILD_CLIENT)
336
337 if(BUILD_SERVER)
338         add_executable(${PROJECT_NAME}server ${minetestserver_SRCS})
339         target_link_libraries(
340                 ${PROJECT_NAME}server
341                 ${ZLIB_LIBRARIES}
342                 ${JTHREAD_LIBRARY}
343                 ${SQLITE3_LIBRARY}
344                 ${LUA_LIBRARY}
345                 ${PLATFORM_LIBS}
346         )
347 endif(BUILD_SERVER)
348
349 #
350 # Set some optimizations and tweaks
351 #
352
353 include(CheckCXXCompilerFlag)
354
355 if(MSVC)
356         # Visual Studio
357
358         # EHa enables SEH exceptions (used for catching segfaults)
359         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")
360         #set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
361         set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
362
363         # Debug build doesn't catch exceptions by itself
364         # Add some optimizations because otherwise it's VERY slow
365         set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
366
367         # Flags for C files (sqlite)
368         # /MT = Link statically with standard library stuff
369         set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MT")
370         
371         if(BUILD_SERVER)
372                 set_target_properties(${PROJECT_NAME}server PROPERTIES
373                                 COMPILE_DEFINITIONS "SERVER")
374         endif(BUILD_SERVER)
375
376 else()
377         # Probably GCC
378         
379         if(WARN_ALL)
380                 set(RELEASE_WARNING_FLAGS "-Wall")
381         else()
382                 set(RELEASE_WARNING_FLAGS "")
383         endif()
384         
385         if(NOT APPLE AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
386                 CHECK_CXX_COMPILER_FLAG("-Wno-unused-but-set-variable" HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
387                 if(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
388                         set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-but-set-variable")
389                 endif(HAS_UNUSED_BUT_SET_VARIABLE_WARNING)
390         endif()
391
392         if(MINGW)
393                 set(OTHER_FLAGS "-mthreads -fexceptions")
394         endif()
395
396         if(APPLE)
397                 set(CMAKE_OSX_ARCHITECTURES i386 CACHE STRING "do not build for 64-bit" FORCE)
398                 set(ARCH i386)
399         endif()
400
401         set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -O3 -ffast-math -Wall -fomit-frame-pointer -pipe -funroll-loops")
402         set(CMAKE_CXX_FLAGS_DEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}")
403
404         if(USE_GPROF)
405                 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
406         endif()
407         
408         if(BUILD_SERVER)
409                 set_target_properties(${PROJECT_NAME}server PROPERTIES
410                                 COMPILE_DEFINITIONS "SERVER")
411         endif(BUILD_SERVER)
412
413 endif()
414
415 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}")
416 #MESSAGE(STATUS "CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}")
417
418 #
419 # Installation
420 #
421 if(WIN32)
422         if(MINGWM10_DLL)
423                 install(FILES ${MINGWM10_DLL} DESTINATION ${BINDIR})
424         endif()
425         if(DEFINED ZLIB_DLL)
426                 install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
427         endif()
428         if(USE_SOUND)
429                 if(OPENAL_DLL)
430                         install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR})
431                 endif()
432                 if(OGG_DLL)
433                         install(FILES ${OGG_DLL} DESTINATION ${BINDIR})
434                 endif()
435                 if(VORBIS_DLL)
436                         install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR})
437                 endif()
438                 if(VORBISFILE_DLL)
439                         install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR})
440                 endif()
441                 if(CURL_DLL)
442                         install(FILES ${CURL_DLL} DESTINATION ${BINDIR})
443                 endif()
444         endif()
445 endif()
446
447 if(BUILD_CLIENT)
448         install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
449
450         if(USE_GETTEXT)
451                 foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
452                         set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
453                         set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
454                         install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
455                 endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
456         endif()
457
458         if(WIN32)
459                 if(DEFINED IRRLICHT_DLL)
460                         install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
461                 endif()
462                 if(USE_GETTEXT)
463                         if(DEFINED GETTEXT_DLL)
464                                 install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR})
465                         endif()
466                         if(DEFINED GETTEXT_ICONV_DLL)
467                                 install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR})
468                         endif()
469                 endif(USE_GETTEXT)
470         endif()
471 endif(BUILD_CLIENT)
472
473 if(BUILD_SERVER)
474         install(TARGETS ${PROJECT_NAME}server DESTINATION ${BINDIR})
475 endif(BUILD_SERVER)
476
477 if (USE_GETTEXT)
478         set(MO_FILES)
479
480         foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
481                 set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/minetest.po")
482                 set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
483                 set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
484
485                 add_custom_command(OUTPUT ${MO_BUILD_PATH}
486                         COMMAND ${CMAKE_COMMAND} -E make_directory ${MO_BUILD_PATH}
487                         COMMENT "mo-update [${LOCALE}]: Creating locale directory.")
488
489                 add_custom_command(
490                         OUTPUT ${MO_FILE_PATH}
491                         COMMAND ${GETTEXT_MSGFMT} -o ${MO_FILE_PATH} ${PO_FILE_PATH}
492                         DEPENDS ${MO_BUILD_PATH} ${PO_FILE_PATH}
493                         WORKING_DIRECTORY "${GETTEXT_PO_PATH}/${LOCALE}"
494                         COMMENT "mo-update [${LOCALE}]: Creating mo file."
495                         )
496
497                 set(MO_FILES ${MO_FILES} ${MO_FILE_PATH})
498         endforeach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
499
500         add_custom_target(translations ALL COMMENT "mo update" DEPENDS ${MO_FILES})
501 endif(USE_GETTEXT)
502
503 # Subdirectories
504
505 if (JTHREAD_FOUND)
506 else (JTHREAD_FOUND)
507         add_subdirectory(jthread)
508 endif (JTHREAD_FOUND)
509
510 if (SQLITE3_FOUND)
511 else (SQLITE3_FOUND)
512         add_subdirectory(sqlite)
513 endif (SQLITE3_FOUND)
514
515 if (LUA_FOUND)
516 else (LUA_FOUND)
517         add_subdirectory(lua)
518 endif (LUA_FOUND)
519
520 #end