diff --git a/CMakeLists.txt b/CMakeLists.txt index 2de5fd854..043e8526c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,11 +34,37 @@ IF(COMMAND cmake_policy) ENDIF() ENDIF() + +#----------------------------------------------------------------------------- +# Downloads and install Hunger into HUNTER_ROOT directory. +OPTION(HUNTER_ENABLED "Enable Hunter package manager" OFF) +IF(HUNTER_ENABLED) + INCLUDE("CMakeModules/HunterGate.cmake") + HunterGate( + URL "https://github.com/cpp-pm/hunter/archive/v0.23.317.tar.gz" + SHA1 "fbdd94b1966d351384e27b02c8d134915b1131d6" + FILEPATH "${CMAKE_CURRENT_LIST_DIR}/CMakeModules/HunterConfig.cmake" + ) + + # default options for hunterized build + SET(WITH_STATIC ON CACHE BOOL "static" FORCE) + SET(WITH_STATIC_DRIVERS ON CACHE BOOL "static drivers" FORCE) + SET(WITH_STATIC_CURL ON CACHE BOOL "static curl" FORCE) + SET(WITH_STATIC_LIBXML2 ON CACHE BOOL "static libxml2" FORCE) + SET(WITH_STATIC_EXTERNAL ON CACHE BOOL "static external" FORCE) + SET(WITH_EXTERNAL OFF CACHE BOOL "external libs" FORCE) +ENDIF() + + +#----------------------------------------------------------------------------- + INCLUDE(nel) INCLUDE(ConfigureChecks) INCLUDE(CheckDepends) INCLUDE(${CMAKE_ROOT}/Modules/Documentation.cmake OPTIONAL) +MESSAGE("EXTERNAL ${WITH_EXTERNAL}") + # Force out of source builds. CHECK_OUT_OF_SOURCE() @@ -130,6 +156,28 @@ IF(WIN32) ENDIF() ENDIF() +IF(HUNTER_ENABLED) + ## TODO: hack for freetype hunter package + SET(ON 1) + ## + HUNTER_ADD_PACKAGE(ZLIB) + + FIND_PACKAGE(ZLIB CONFIG REQUIRED) + SET(ZLIB_LIBRARY ZLIB::zlib) + + HUNTER_ADD_PACKAGE(libxml2) + FIND_PACKAGE(libxml2 CONFIG REQUIRED) + SET(LIBXML2_LIBRARIES ${LIBXML2_LIBRARIES} libxml2::libxml2) + + HUNTER_ADD_PACKAGE(OpenSSL) + FIND_PACKAGE(OpenSSL REQUIRED) + # TODO: is OpenSSL::Crypto only needed for WIN32? + SET(OPENSSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto) + + # for precompiled headers, not needed if using TARGET_PRECOMPILE_HEADERS() from cmake 3.16+ + SET(ZLIB_INCLUDE_DIR ZLIB_ROOT/include) + SET(LIBXML2_INCLUDE_DIR ${LIBXML2_ROOT}/include/libxml2) +ELSE() FIND_PACKAGE(ZLIB REQUIRED) FIND_PACKAGE(LibXml2 REQUIRED) FIND_PACKAGE(PNG REQUIRED) @@ -140,6 +188,7 @@ FIND_PACKAGE(Jpeg) IF(WIN32) SET(OPENSSL_LIBRARIES ${OPENSSL_LIBRARIES} Crypt32.lib) ENDIF() +ENDIF() #hunter IF(WITH_LIBOVR) FIND_PACKAGE(LibOVR) @@ -233,6 +282,7 @@ ENDIF() INCLUDE(FindHelpers) +#TODO: hunter qt package IF(WITH_QT5) FIND_QT5() ENDIF() @@ -244,6 +294,7 @@ IF(WITH_QT) FIND_PACKAGE(Qt4 COMPONENTS QtCore QtGui QtXml QtOpenGL REQUIRED) ENDIF() +#TODO: hunter assimp package IF(WITH_ASSIMP) FIND_PACKAGE(assimp REQUIRED) ENDIF() @@ -253,9 +304,20 @@ IF(WITH_NEL) FIND_PACKAGE(CppTest) ENDIF() - IF(WITH_GUI) - FIND_PACKAGE(Luabind REQUIRED) - ENDIF() + IF(HUNTER_ENABLED) + IF(WITH_GUI) + HUNTER_ADD_PACKAGE(luabind) + FIND_PACKAGE(Luabind REQUIRED) + ENDIF() + + HUNTER_ADD_PACKAGE(CURL) + FIND_PACKAGE(CURL CONFIG REQUIRED) + # TODO: for nelgui + SET(CURL_LIBRARIES CURL::libcurl libxml2::libxml2) + ELSE() + IF(WITH_GUI) + FIND_PACKAGE(Luabind REQUIRED) + ENDIF() FIND_PACKAGE(CURL REQUIRED) @@ -306,6 +368,7 @@ IF(WITH_NEL) ENDIF() ENDIF() ENDIF() + ENDIF() #hunter INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/nel/include) ADD_SUBDIRECTORY(nel) diff --git a/CMakeModules/FindLuabind.cmake b/CMakeModules/FindLuabind.cmake index 37cccd3f6..81cbbfee7 100644 --- a/CMakeModules/FindLuabind.cmake +++ b/CMakeModules/FindLuabind.cmake @@ -83,7 +83,11 @@ MACRO(FIND_CORRECT_LUA_VERSION) ENDIF() ELSE() # TODO: find a way to detect Lua version - IF(WITH_LUA54) + IF(HUNTER_ENABLED) + HUNTER_ADD_PACKAGE(Lua) + FIND_PACKAGE(Lua CONFIG REQUIRED) + SET(LUA_LIBRARIES Lua::lua_lib) + ELSEIF(WITH_LUA54) FIND_PACKAGE(Lua54 REQUIRED) ELSEIF(WITH_LUA53) FIND_PACKAGE(Lua53 REQUIRED) @@ -115,6 +119,11 @@ IF(WITH_LUA54) LIST(APPEND LIBRARY_NAME_DEBUG luabind_lua54d) ENDIF() +IF(HUNTER_ENABLED) + LIST(APPEND LIBRARY_NAME_RELEASE luabind luabind09) + LIST(APPEND LIBRARY_NAME_DEBUG luabindd luabind09-d) +ENDIF() + IF(WITH_LUA53) IF(WITH_STLPORT) LIST(APPEND LIBRARY_NAME_RELEASE luabind_stlport_lua53) diff --git a/CMakeModules/FindWindowsSDK.cmake b/CMakeModules/FindWindowsSDK.cmake index 1b02dffb3..20787aa79 100644 --- a/CMakeModules/FindWindowsSDK.cmake +++ b/CMakeModules/FindWindowsSDK.cmake @@ -501,6 +501,17 @@ IF(WINSDK_INCLUDE_DIR) IF(WINSDK_VERSION STREQUAL "7.1" AND (MSVC11 OR MSVC12 OR MSVC14)) ADD_DEFINITIONS(-D_USING_V110_SDK71_) ENDIF() + + IF(NOT DXSDK_DIR) + MESSAGE("Using DirectX from Windows SDK (${WINSDK_LIBRARY_DIRS})") + SET(DXSDK_DIR ${WINSDK_DIR}) + FIND_LIBRARY(DXSDK_GUID_LIBRARY dxguid ${WINSDK_LIBRARY_DIRS}) + FIND_LIBRARY(DXSDK_DINPUT_LIBRARY dinput8 ${WINSDK_LIBRARY_DIRS}) + FIND_LIBRARY(DXSDK_DSOUND_LIBRARY dsound ${WINSDK_LIBRARY_DIRS}) + FIND_LIBRARY(DXSDK_XAUDIO_LIBRARY xaudio2 ${WINSDK_LIBRARY_DIRS}) + # TODO: FIND_LIBRARY(DXSDK_D3DX9_LIBRARY d3dx9) + FIND_LIBRARY(DXSDK_D3D9_LIBRARY d3d9 ${WINSDK_LIBRARY_DIRS}) + ENDIF() ELSE() IF(NOT WindowsSDK_FIND_QUIETLY) MESSAGE(STATUS "Warning: Unable to find Windows SDK!") diff --git a/CMakeModules/HunterConfig.cmake b/CMakeModules/HunterConfig.cmake new file mode 100644 index 000000000..144eeeb6a --- /dev/null +++ b/CMakeModules/HunterConfig.cmake @@ -0,0 +1,8 @@ +# This file is parsed by HunterGate command + +hunter_config(luabind + VERSION 0.9.1 + URL "https://github.com/nimetu/luabind/tarball/2fa4606" + SHA1 "3b4646bab9f0b2362d7b8d71d78e40deaf3cc747" + ) + diff --git a/CMakeModules/HunterGate.cmake b/CMakeModules/HunterGate.cmake new file mode 100644 index 000000000..64ccde563 --- /dev/null +++ b/CMakeModules/HunterGate.cmake @@ -0,0 +1,537 @@ +# Copyright (c) 2013-2019, Ruslan Baratov +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# This is a gate file to Hunter package manager. +# Include this file using `include` command and add package you need, example: +# +# cmake_minimum_required(VERSION 3.2) +# +# include("cmake/HunterGate.cmake") +# HunterGate( +# URL "https://github.com/path/to/hunter/archive.tar.gz" +# SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d" +# ) +# +# project(MyProject) +# +# hunter_add_package(Foo) +# hunter_add_package(Boo COMPONENTS Bar Baz) +# +# Projects: +# * https://github.com/hunter-packages/gate/ +# * https://github.com/ruslo/hunter + +option(HUNTER_ENABLED "Enable Hunter package manager support" ON) + +if(HUNTER_ENABLED) + if(CMAKE_VERSION VERSION_LESS "3.2") + message( + FATAL_ERROR + "At least CMake version 3.2 required for Hunter dependency management." + " Update CMake or set HUNTER_ENABLED to OFF." + ) + endif() +endif() + +include(CMakeParseArguments) # cmake_parse_arguments + +option(HUNTER_STATUS_PRINT "Print working status" ON) +option(HUNTER_STATUS_DEBUG "Print a lot info" OFF) +option(HUNTER_TLS_VERIFY "Enable/disable TLS certificate checking on downloads" ON) +set(HUNTER_ROOT "" CACHE FILEPATH "Override the HUNTER_ROOT.") + +set(HUNTER_ERROR_PAGE "https://hunter.readthedocs.io/en/latest/reference/errors") + +function(hunter_gate_status_print) + if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG) + foreach(print_message ${ARGV}) + message(STATUS "[hunter] ${print_message}") + endforeach() + endif() +endfunction() + +function(hunter_gate_status_debug) + if(HUNTER_STATUS_DEBUG) + foreach(print_message ${ARGV}) + string(TIMESTAMP timestamp) + message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}") + endforeach() + endif() +endfunction() + +function(hunter_gate_error_page error_page) + message("------------------------------ ERROR ------------------------------") + message(" ${HUNTER_ERROR_PAGE}/${error_page}.html") + message("-------------------------------------------------------------------") + message("") + message(FATAL_ERROR "") +endfunction() + +function(hunter_gate_internal_error) + message("") + foreach(print_message ${ARGV}) + message("[hunter ** INTERNAL **] ${print_message}") + endforeach() + message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") + message("") + hunter_gate_error_page("error.internal") +endfunction() + +function(hunter_gate_fatal_error) + cmake_parse_arguments(hunter "" "ERROR_PAGE" "" "${ARGV}") + if("${hunter_ERROR_PAGE}" STREQUAL "") + hunter_gate_internal_error("Expected ERROR_PAGE") + endif() + message("") + foreach(x ${hunter_UNPARSED_ARGUMENTS}) + message("[hunter ** FATAL ERROR **] ${x}") + endforeach() + message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") + message("") + hunter_gate_error_page("${hunter_ERROR_PAGE}") +endfunction() + +function(hunter_gate_user_error) + hunter_gate_fatal_error(${ARGV} ERROR_PAGE "error.incorrect.input.data") +endfunction() + +function(hunter_gate_self root version sha1 result) + string(COMPARE EQUAL "${root}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("root is empty") + endif() + + string(COMPARE EQUAL "${version}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("version is empty") + endif() + + string(COMPARE EQUAL "${sha1}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("sha1 is empty") + endif() + + string(SUBSTRING "${sha1}" 0 7 archive_id) + + if(EXISTS "${root}/cmake/Hunter") + set(hunter_self "${root}") + else() + set( + hunter_self + "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked" + ) + endif() + + set("${result}" "${hunter_self}" PARENT_SCOPE) +endfunction() + +# Set HUNTER_GATE_ROOT cmake variable to suitable value. +function(hunter_gate_detect_root) + # Check CMake variable + if(HUNTER_ROOT) + set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable") + return() + endif() + + # Check environment variable + if(DEFINED ENV{HUNTER_ROOT}) + set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT detected by environment variable") + return() + endif() + + # Check HOME environment variable + if(DEFINED ENV{HOME}) + set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable") + return() + endif() + + # Check SYSTEMDRIVE and USERPROFILE environment variable (windows only) + if(WIN32) + if(DEFINED ENV{SYSTEMDRIVE}) + set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug( + "HUNTER_ROOT set using SYSTEMDRIVE environment variable" + ) + return() + endif() + + if(DEFINED ENV{USERPROFILE}) + set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug( + "HUNTER_ROOT set using USERPROFILE environment variable" + ) + return() + endif() + endif() + + hunter_gate_fatal_error( + "Can't detect HUNTER_ROOT" + ERROR_PAGE "error.detect.hunter.root" + ) +endfunction() + +function(hunter_gate_download dir) + string( + COMPARE + NOTEQUAL + "$ENV{HUNTER_DISABLE_AUTOINSTALL}" + "" + disable_autoinstall + ) + if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL) + hunter_gate_fatal_error( + "Hunter not found in '${dir}'" + "Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'" + "Settings:" + " HUNTER_ROOT: ${HUNTER_GATE_ROOT}" + " HUNTER_SHA1: ${HUNTER_GATE_SHA1}" + ERROR_PAGE "error.run.install" + ) + endif() + string(COMPARE EQUAL "${dir}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("Empty 'dir' argument") + endif() + + string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("HUNTER_GATE_SHA1 empty") + endif() + + string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("HUNTER_GATE_URL empty") + endif() + + set(done_location "${dir}/DONE") + set(sha1_location "${dir}/SHA1") + + set(build_dir "${dir}/Build") + set(cmakelists "${dir}/CMakeLists.txt") + + hunter_gate_status_debug("Locking directory: ${dir}") + file(LOCK "${dir}" DIRECTORY GUARD FUNCTION) + hunter_gate_status_debug("Lock done") + + if(EXISTS "${done_location}") + # while waiting for lock other instance can do all the job + hunter_gate_status_debug("File '${done_location}' found, skip install") + return() + endif() + + file(REMOVE_RECURSE "${build_dir}") + file(REMOVE_RECURSE "${cmakelists}") + + file(MAKE_DIRECTORY "${build_dir}") # check directory permissions + + # Disabling languages speeds up a little bit, reduces noise in the output + # and avoids path too long windows error + file( + WRITE + "${cmakelists}" + "cmake_minimum_required(VERSION 3.2)\n" + "project(HunterDownload LANGUAGES NONE)\n" + "include(ExternalProject)\n" + "ExternalProject_Add(\n" + " Hunter\n" + " URL\n" + " \"${HUNTER_GATE_URL}\"\n" + " URL_HASH\n" + " SHA1=${HUNTER_GATE_SHA1}\n" + " DOWNLOAD_DIR\n" + " \"${dir}\"\n" + " TLS_VERIFY\n" + " ${HUNTER_TLS_VERIFY}\n" + " SOURCE_DIR\n" + " \"${dir}/Unpacked\"\n" + " CONFIGURE_COMMAND\n" + " \"\"\n" + " BUILD_COMMAND\n" + " \"\"\n" + " INSTALL_COMMAND\n" + " \"\"\n" + ")\n" + ) + + if(HUNTER_STATUS_DEBUG) + set(logging_params "") + else() + set(logging_params OUTPUT_QUIET) + endif() + + hunter_gate_status_debug("Run generate") + + # Need to add toolchain file too. + # Otherwise on Visual Studio + MDD this will fail with error: + # "Could not find an appropriate version of the Windows 10 SDK installed on this machine" + if(EXISTS "${CMAKE_TOOLCHAIN_FILE}") + get_filename_component(absolute_CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE) + set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${absolute_CMAKE_TOOLCHAIN_FILE}") + else() + # 'toolchain_arg' can't be empty + set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=") + endif() + + string(COMPARE EQUAL "${CMAKE_MAKE_PROGRAM}" "" no_make) + if(no_make) + set(make_arg "") + else() + # Test case: remove Ninja from PATH but set it via CMAKE_MAKE_PROGRAM + set(make_arg "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}") + endif() + + execute_process( + COMMAND + "${CMAKE_COMMAND}" + "-H${dir}" + "-B${build_dir}" + "-G${CMAKE_GENERATOR}" + "${toolchain_arg}" + ${make_arg} + WORKING_DIRECTORY "${dir}" + RESULT_VARIABLE download_result + ${logging_params} + ) + + if(NOT download_result EQUAL 0) + hunter_gate_internal_error( + "Configure project failed." + "To reproduce the error run: ${CMAKE_COMMAND} -H${dir} -B${build_dir} -G${CMAKE_GENERATOR} ${toolchain_arg} ${make_arg}" + "In directory ${dir}" + ) + endif() + + hunter_gate_status_print( + "Initializing Hunter workspace (${HUNTER_GATE_SHA1})" + " ${HUNTER_GATE_URL}" + " -> ${dir}" + ) + execute_process( + COMMAND "${CMAKE_COMMAND}" --build "${build_dir}" + WORKING_DIRECTORY "${dir}" + RESULT_VARIABLE download_result + ${logging_params} + ) + + if(NOT download_result EQUAL 0) + hunter_gate_internal_error("Build project failed") + endif() + + file(REMOVE_RECURSE "${build_dir}") + file(REMOVE_RECURSE "${cmakelists}") + + file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}") + file(WRITE "${done_location}" "DONE") + + hunter_gate_status_debug("Finished") +endfunction() + +# Must be a macro so master file 'cmake/Hunter' can +# apply all variables easily just by 'include' command +# (otherwise PARENT_SCOPE magic needed) +macro(HunterGate) + if(HUNTER_GATE_DONE) + # variable HUNTER_GATE_DONE set explicitly for external project + # (see `hunter_download`) + set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) + endif() + + # First HunterGate command will init Hunter, others will be ignored + get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET) + + if(NOT HUNTER_ENABLED) + # Empty function to avoid error "unknown function" + function(hunter_add_package) + endfunction() + + set( + _hunter_gate_disabled_mode_dir + "${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/disabled-mode" + ) + if(EXISTS "${_hunter_gate_disabled_mode_dir}") + hunter_gate_status_debug( + "Adding \"disabled-mode\" modules: ${_hunter_gate_disabled_mode_dir}" + ) + list(APPEND CMAKE_PREFIX_PATH "${_hunter_gate_disabled_mode_dir}") + endif() + elseif(_hunter_gate_done) + hunter_gate_status_debug("Secondary HunterGate (use old settings)") + hunter_gate_self( + "${HUNTER_CACHED_ROOT}" + "${HUNTER_VERSION}" + "${HUNTER_SHA1}" + _hunter_self + ) + include("${_hunter_self}/cmake/Hunter") + else() + set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}") + + string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name) + if(_have_project_name) + hunter_gate_fatal_error( + "Please set HunterGate *before* 'project' command. " + "Detected project: ${PROJECT_NAME}" + ERROR_PAGE "error.huntergate.before.project" + ) + endif() + + cmake_parse_arguments( + HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV} + ) + + string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1) + string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url) + string( + COMPARE + NOTEQUAL + "${HUNTER_GATE_UNPARSED_ARGUMENTS}" + "" + _have_unparsed + ) + string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global) + string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath) + + if(_have_unparsed) + hunter_gate_user_error( + "HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}" + ) + endif() + if(_empty_sha1) + hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory") + endif() + if(_empty_url) + hunter_gate_user_error("URL suboption of HunterGate is mandatory") + endif() + if(_have_global) + if(HUNTER_GATE_LOCAL) + hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)") + endif() + if(_have_filepath) + hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)") + endif() + endif() + if(HUNTER_GATE_LOCAL) + if(_have_global) + hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)") + endif() + if(_have_filepath) + hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)") + endif() + endif() + if(_have_filepath) + if(_have_global) + hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)") + endif() + if(HUNTER_GATE_LOCAL) + hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)") + endif() + endif() + + hunter_gate_detect_root() # set HUNTER_GATE_ROOT + + # Beautify path, fix probable problems with windows path slashes + get_filename_component( + HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE + ) + hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}") + if(NOT HUNTER_ALLOW_SPACES_IN_PATH) + string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces) + if(NOT _contain_spaces EQUAL -1) + hunter_gate_fatal_error( + "HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces." + "Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error" + "(Use at your own risk!)" + ERROR_PAGE "error.spaces.in.hunter.root" + ) + endif() + endif() + + string( + REGEX + MATCH + "[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*" + HUNTER_GATE_VERSION + "${HUNTER_GATE_URL}" + ) + string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty) + if(_is_empty) + set(HUNTER_GATE_VERSION "unknown") + endif() + + hunter_gate_self( + "${HUNTER_GATE_ROOT}" + "${HUNTER_GATE_VERSION}" + "${HUNTER_GATE_SHA1}" + _hunter_self + ) + + set(_master_location "${_hunter_self}/cmake/Hunter") + if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter") + # Hunter downloaded manually (e.g. by 'git clone') + set(_unused "xxxxxxxxxx") + set(HUNTER_GATE_SHA1 "${_unused}") + set(HUNTER_GATE_VERSION "${_unused}") + else() + get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE) + set(_done_location "${_archive_id_location}/DONE") + set(_sha1_location "${_archive_id_location}/SHA1") + + # Check Hunter already downloaded by HunterGate + if(NOT EXISTS "${_done_location}") + hunter_gate_download("${_archive_id_location}") + endif() + + if(NOT EXISTS "${_done_location}") + hunter_gate_internal_error("hunter_gate_download failed") + endif() + + if(NOT EXISTS "${_sha1_location}") + hunter_gate_internal_error("${_sha1_location} not found") + endif() + file(READ "${_sha1_location}" _sha1_value) + string(TOLOWER "${_sha1_value}" _sha1_value_lower) + string(TOLOWER "${HUNTER_GATE_SHA1}" _HUNTER_GATE_SHA1_lower) + string(COMPARE EQUAL "${_sha1_value_lower}" "${_HUNTER_GATE_SHA1_lower}" _is_equal) + if(NOT _is_equal) + hunter_gate_internal_error( + "Short SHA1 collision:" + " ${_sha1_value} (from ${_sha1_location})" + " ${HUNTER_GATE_SHA1} (HunterGate)" + ) + endif() + if(NOT EXISTS "${_master_location}") + hunter_gate_user_error( + "Master file not found:" + " ${_master_location}" + "try to update Hunter/HunterGate" + ) + endif() + endif() + include("${_master_location}") + set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) + endif() +endmacro() diff --git a/CMakeModules/nel.cmake b/CMakeModules/nel.cmake index 39b7d6c14..5cb0063df 100644 --- a/CMakeModules/nel.cmake +++ b/CMakeModules/nel.cmake @@ -121,6 +121,22 @@ MACRO(NL_ADD_RUNTIME_FLAGS name) ENDMACRO(NL_ADD_RUNTIME_FLAGS) MACRO(NL_ADD_STATIC_VID_DRIVERS name) +IF(HUNTER_ENABLED) + IF(WIN32) + SET(drv_suffix "_win") + ELSE() + SET(drv_suffix "") + ENDIF() + IF(WIN32 AND WITH_DRIVER_DIRECT3D) + TARGET_LINK_LIBRARIES(${name} nel_drv_direct3d${drv_suffix}) + ENDIF() + IF(WITH_DRIVER_OPENGL) + TARGET_LINK_LIBRARIES(${name} nel_drv_opengl${drv_suffix}) + ENDIF() + IF(WITH_DRIVER_OPENGLES) + TARGET_LINK_LIBRARIES(${name} nel_drv_opengles${drv_suffix}) + ENDIF() +ELSE() IF(WITH_STATIC_DRIVERS) IF(WIN32) IF(WITH_DRIVER_DIRECT3D) @@ -144,9 +160,29 @@ MACRO(NL_ADD_STATIC_VID_DRIVERS name) ENDIF() ENDIF() ENDIF() +ENDIF()#hunter ENDMACRO(NL_ADD_STATIC_VID_DRIVERS) MACRO(NL_ADD_STATIC_SND_DRIVERS name) +IF(HUNTER_ENABLED) + IF(WIN32) + SET(drv_suffix "_win") + ELSE() + SET(drv_suffix "") + ENDIF() + IF(WIN32 AND WITH_DRIVER_DSOUND) + TARGET_LINK_LIBRARIES(${name} nel_drv_dsound${drv_suffix}) + ENDIF() + IF(WIN32 AND WITH_DRIVER_XAUDIO2) + TARGET_LINK_LIBRARIES(${name} nel_drv_xaudio2${drv_suffix}) + ENDIF() + IF(WITH_DRIVER_FMOD) + TARGET_LINK_LIBRARIES(${name} nel_drv_fmod${drv_suffix}) + ENDIF() + IF(WITH_DRIVER_OPENAL) + TARGET_LINK_LIBRARIES(${name} nel_drv_openal${drv_suffix}) + ENDIF() +ELSE() IF(WITH_STATIC_DRIVERS) IF(WIN32) IF(WITH_DRIVER_DSOUND) @@ -175,6 +211,7 @@ MACRO(NL_ADD_STATIC_SND_DRIVERS name) ENDIF() ENDIF() +ENDIF() #hunter ENDMACRO(NL_ADD_STATIC_SND_DRIVERS) ### @@ -1196,7 +1233,11 @@ MACRO(SETUP_EXTERNAL) ENDIF() IF(WIN32) - FIND_PACKAGE(External REQUIRED) + IF (HUNTER_ENABLED) + FIND_PACKAGE(External QUIET) + ELSE() + FIND_PACKAGE(External REQUIRED) + ENDIF() # If using custom boost, we need to define the right variables used by official boost CMake module IF(DEFINED BOOST_DIR) @@ -1239,7 +1280,7 @@ MACRO(SETUP_EXTERNAL) IF(WIN32) # Must include DXSDK before WINSDK - FIND_PACKAGE(DirectXSDK REQUIRED) + FIND_PACKAGE(DirectXSDK) # IF(DXSDK_INCLUDE_DIR) # INCLUDE_DIRECTORIES(${DXSDK_INCLUDE_DIR}) # ENDIF() @@ -1248,5 +1289,8 @@ MACRO(SETUP_EXTERNAL) IF(MSVC) FIND_PACKAGE(MSVC REQUIRED) FIND_PACKAGE(WindowsSDK REQUIRED) + IF(NOT DXSDK_DIR) + MESSAGE(FATAL_ERROR "DirectX SDK or DirectX files from Windows SDK not found.") + ENDIF() ENDIF() ENDMACRO() diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1885a5dfa..9c735531b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -77,3 +77,88 @@ jobs: cd build make -j`nproc` displayName: 'Make' + - job: windows2019 + timeoutInMinutes: 120 + pool: + vmImage: 'windows-2019' + steps: + - checkout: self + fetchDepth: 1 + - task: Cache@2 + inputs: + key: 'hunter-win2019-x64-rel' + path: "c:/.hunter/_Base/Cache" + - task: CmdLine@2 + inputs: + script: | + aria2c https://download.microsoft.com/download/A/E/7/AE743F1F-632B-4809-87A9-AA1BB3458E31/DXSDK_Jun10.exe + 7z x DXSDK_Jun10.exe -oC:\ -r -y + del DXSDK_Jun10.exe + - task: CMake@1 + inputs: + workingDirectory: build.release + cmakeArgs: '-DCMAKE_CONFIGURATION_TYPES=Release -DHUNTER_ENABLED=ON -DHUNTER_CONFIGURATION_TYPES=Release -DFINAL_VERSION=OFF -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=OFF -DWITH_NEL_TOOLS=OFF -DWITH_RYZOM_TOOLS=OFF -DWITH_RYZOM_SERVER=OFF -DWITH_RYZOM_CLIENT=ON -DWITH_DRIVER_OPENGL=ON -DWITH_DRIVER_OPENAL=ON -DWITH_DRIVER_DIRECT3D=ON -DWITH_DRIVER_XAUDIO2=ON -DDXSDK_DIR=C:/DXSDK ..' + - task: MSBuild@1 + inputs: + solution: build.release/ALL_BUILD.vcxproj + maximumCpuCount: true + configuration: release + platform: 'x64' + - job: ubuntu18hunter + timeoutInMinutes: 120 + pool: + vmImage: ubuntu-18.04 + steps: + - checkout: self + fetchDepth: 0 + - script: | + sudo apt-get update + sudo DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends libasound2-dev libgl1-mesa-dev libjack-dev libpulse-dev libxrandr-dev libxrender-dev libxxf86vm-dev + displayName: 'Dependencies' + - task: Cache@2 + inputs: + key: 'hunter317-ubuntu18-rel"' + path: "$(Pipeline.Workspace)/.hunter/_Base/Cache" + - script: | + mkdir build.release + cmake --version + cd build.release + unset SYSTEM + export MAKEFLAGS=-j`nproc` + cmake -DCMAKE_BUILD_TYPE=Release -DHUNTER_ENABLED=ON -DHUNTER_CONFIGURATION_TYPES=Release -DHUNTER_ROOT="$(Pipeline.Workspace)/.hunter" -DFINAL_VERSION=OFF -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=OFF -DWITH_NEL_TOOLS=OFF -DWITH_RYZOM_TOOLS=OFF -DWITH_RYZOM_SERVER=OFF -DWITH_RYZOM_CLIENT=ON -DWITH_DRIVER_OPENGL=ON -DWITH_DRIVER_OPENAL=ON .. + displayName: 'CMake, release' + - script: | + cd build.release + make -j`nproc` + displayName: 'Make, release' + #- task: PublishPipelineArtifact@1 + # inputs: + # targetPath: build.release/bin + # artifactName: RyzomUbuntu18Release + - job: macOS11 + timeoutInMinutes: 120 + pool: + vmImage: 'macOS-11' + steps: + - checkout: self + fetchDepth: 0 + - task: Cache@2 + inputs: + key: 'hunter317-macOS11-rel"' + path: "$(Pipeline.Workspace)/.hunter/_Base/Cache" + - task: CMake@1 + inputs: + workingDirectory: build.release + cmakeArgs: '-GXcode -DCMAKE_CONFIGURATION_TYPES=Release -DHUNTER_ENABLED=ON -DHUNTER_STATUS_DEBUG=ON -DHUNTER_CONFIGURATION_TYPES=Release -DHUNTER_ROOT="$(Pipeline.Workspace)/.hunter" -DWITH_LIBXML2_ICONV=OFF -DFINAL_VERSION=OFF -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=OFF -DWITH_NEL_TOOLS=OFF -DWITH_RYZOM_TOOLS=OFF -DWITH_RYZOM_SERVER=OFF -DWITH_RYZOM_CLIENT=ON -DWITH_DRIVER_OPENGL=ON -DWITH_DRIVER_OPENAL=ON -DWITH_DRIVER_DIRECT3D=OFF -DWITH_DRIVER_XAUDIO2=OFF ..' + - task: Xcode@5 + inputs: + actions: 'build' + configuration: Release + sdk: macosx12.0 + xcWorkspacePath: 'build.release/RyzomCore.xcodeproj' + scheme: 'ALL_BUILD' + packageApp: false + #- task: PublishPipelineArtifact@1 + # inputs: + # targetPath: build.release/bin/ + # artifactName: RyzomClientMacOS11Release diff --git a/nel/CMakeLists.txt b/nel/CMakeLists.txt index b102310ab..e080c640c 100644 --- a/nel/CMakeLists.txt +++ b/nel/CMakeLists.txt @@ -10,14 +10,20 @@ IF(WIN32) ENDIF() IF(WITH_3D) - FIND_PACKAGE(FreeType) + IF(HUNTER_ENABLED) + HUNTER_ADD_PACKAGE(freetype) + FIND_PACKAGE(freetype CONFIG REQUIRED) + SET(FREETYPE_LIBRARIES freetype::freetype) + ELSE() + FIND_PACKAGE(FreeType) + ENDIF() #hunter IF(WITH_NEL_CEGUI) FIND_PACKAGE(CEGUI) ENDIF() ENDIF() -IF(WITH_SOUND) +IF(WITH_SOUND AND NOT HUNTER_ENABLED) FIND_PACKAGE(Ogg) FIND_PACKAGE(Vorbis) IF(WITH_FFMPEG) diff --git a/nel/samples/3d/font/CMakeLists.txt b/nel/samples/3d/font/CMakeLists.txt index 29bab2fe5..2ec4ac33c 100644 --- a/nel/samples/3d/font/CMakeLists.txt +++ b/nel/samples/3d/font/CMakeLists.txt @@ -4,6 +4,7 @@ ADD_EXECUTABLE(nl_sample_font WIN32 ${SRC}) TARGET_COMPILE_DEFINITIONS(nl_sample_font PRIVATE "FONT_DIR=\"${NL_SHARE_ABSOLUTE_PREFIX}/nl_sample_font/\"") +# TODO: hunter TARGET_LINK_LIBRARIES(nl_sample_font PRIVATE nelmisc nel3d) TARGET_LINK_LIBRARIES(nl_sample_font nelmisc nel3d) NL_DEFAULT_PROPS(nl_sample_font "NeL, Samples, 3D: Font") NL_ADD_RUNTIME_FLAGS(nl_sample_font) diff --git a/nel/src/misc/CMakeLists.txt b/nel/src/misc/CMakeLists.txt index e7b422592..da92f2593 100644 --- a/nel/src/misc/CMakeLists.txt +++ b/nel/src/misc/CMakeLists.txt @@ -183,6 +183,21 @@ IF(WITH_GTK) ENDIF() ENDIF() +IF(HUNTER_ENABLED) + HUNTER_ADD_PACKAGE(Jpeg) + FIND_PACKAGE(JPEG CONFIG REQUIRED) + SET(JPEG_LIBRARY JPEG::jpeg) + + HUNTER_ADD_PACKAGE(giflib) + FIND_PACKAGE(giflib CONFIG REQUIRED) + SET(GIF_LIBRARY giflib::giflib) + + HUNTER_ADD_PACKAGE(PNG) + FIND_PACKAGE(PNG CONFIG REQUIRED) + SET(PNG_LIBRARY PNG::png) + SET(PNG_LIBRARIES PNG::png) +ENDIF() + IF(JPEG_FOUND) INCLUDE_DIRECTORIES(${JPEG_INCLUDE_DIR}) ADD_DEFINITIONS(-DUSE_JPEG) @@ -202,6 +217,7 @@ ELSE() TARGET_LINK_LIBRARIES(nelmisc ${PNG_LIBRARY}) ENDIF() +#TODO: needed for hunter aswell? IF(UNIX) TARGET_LINK_LIBRARIES(nelmisc -lc -ldl) IF(APPLE) diff --git a/nel/src/sound/CMakeLists.txt b/nel/src/sound/CMakeLists.txt index d2c47387e..0a6f78646 100644 --- a/nel/src/sound/CMakeLists.txt +++ b/nel/src/sound/CMakeLists.txt @@ -90,6 +90,23 @@ SOURCE_GROUP("user_classes" FILES ${USER_CLASSES}) NL_TARGET_LIB(nelsound ${HEADERS} ${SRC}) +IF(HUNTER_ENABLED) + HUNTER_ADD_PACKAGE(libogg) + FIND_PACKAGE(libogg CONFIG REQUIRED) + SET(OGG_LIBRARY libogg::ogg) + SET(OGG_LIBRARIES libogg::ogg) + + HUNTER_ADD_PACKAGE(vorbis) + FIND_PACKAGE(vorbis CONFIG REQUIRED) + SET(VORBIS_LIBRARY vorbis::vorbis) + SET(VORBISFILE_LIBRARY vorbis::vorbisfile) + + IF(WITH_FFMPEG) + HUNTER_ADD_PACKAGE(ffmpeg) + FIND_PACKAGE(ffmpeg CONFIG REQUIRED) + SET(FFMPEG_LIBRARIES ffmpeg::avcodec ffmpeg::avformat ffmpeg::avutil ffmpeg::swresample) + ENDIF() +ENDIF() INCLUDE_DIRECTORIES(${VORBIS_INCLUDE_DIR}) INCLUDE_DIRECTORIES(${OGG_INCLUDE_DIR}) diff --git a/nel/src/sound/driver/openal/CMakeLists.txt b/nel/src/sound/driver/openal/CMakeLists.txt index 22b3f4348..9437dee82 100644 --- a/nel/src/sound/driver/openal/CMakeLists.txt +++ b/nel/src/sound/driver/openal/CMakeLists.txt @@ -26,9 +26,16 @@ SOURCE_GROUP(util FILES NL_TARGET_DRIVER(${NLDRV_AL_LIB} ${SRC}) -INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIR}) +IF(HUNTER_ENABLED) + HUNTER_ADD_PACKAGE(OpenAL) + FIND_PACKAGE(OpenAL CONFIG REQUIRED) + SET(OPENAL_LIBRARY OpenAL::OpenAL) + ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC) +ELSE() + INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIR}) +ENDIF()# hunter -TARGET_LINK_LIBRARIES(${NLDRV_AL_LIB} ${OPENAL_LIBRARY} nelmisc nelsnd_lowlevel) +TARGET_LINK_LIBRARIES(${NLDRV_AL_LIB} nelmisc nelsnd_lowlevel ${OPENAL_LIBRARY}) NL_DEFAULT_PROPS(${NLDRV_AL_LIB} "NeL, Driver, Sound: OpenAL") NL_ADD_RUNTIME_FLAGS(${NLDRV_AL_LIB}) NL_ADD_LIB_SUFFIX(${NLDRV_AL_LIB}) diff --git a/nel/src/sound/driver/openal/ext_al.cpp b/nel/src/sound/driver/openal/ext_al.cpp index e6a090e80..6edeb9552 100644 --- a/nel/src/sound/driver/openal/ext_al.cpp +++ b/nel/src/sound/driver/openal/ext_al.cpp @@ -66,6 +66,7 @@ void alExtInitDevice(ALCdevice *device) } } +#if !defined(AL_LIBTYPE_STATIC) // Windows and Mac OS always link to shared OpenAL library #if defined(NL_OS_WINDOWS) || defined(NL_OS_MAC) || !defined(NL_STATIC) // EFX @@ -114,6 +115,7 @@ void alExtInitDevice(ALCdevice *device) } } #endif +#endif } #if EAX_AVAILABLE @@ -137,6 +139,7 @@ EAXGetBufferMode eaxGetBufferMode = NULL; // ALC_EXT_EFX bool AlExtEfx = false; // effect objects +#if !defined(AL_LIBTYPE_STATIC) #if defined(NL_OS_WINDOWS) || defined(NL_OS_MAC) || !defined(NL_STATIC) LPALGENEFXOBJECTS alGenEffects = NULL; LPALDELETEEFXOBJECTS alDeleteEffects = NULL; @@ -174,6 +177,7 @@ LPALGETEFXOBJECTIV alGetAuxiliaryEffectSlotiv = NULL; LPALGETEFXOBJECTF alGetAuxiliaryEffectSlotf = NULL; LPALGETEFXOBJECTFV alGetAuxiliaryEffectSlotfv = NULL; #endif +#endif } /* end of file */