From bc3e8864e30d8b0c8355dcf7c13ae5155859c44a Mon Sep 17 00:00:00 2001 From: Edgar Date: Wed, 25 Dec 2024 12:27:00 +0100 Subject: [PATCH] :wrench: Use conan_provider for running conan --- .github/workflows/build-game.yml | 9 +- .gitignore | 1 - CMake/FixupBundle.cmake | 1 - CMake/conan_provider.cmake | 676 ++++++++++++++++++++++ CMakeLists.txt | 11 - conanfile.py | 33 +- docs/Building.md | 49 +- docs/BuildingVS.md | 228 +------- tools/conan-profiles/vs-19-debug | 8 - tools/conan-profiles/vs-19-debug-ninja | 10 - tools/conan-profiles/vs-19-release | 8 - tools/conan-profiles/vs-19-release-ninja | 10 - tools/conan-profiles/vs-19-relwithdebinfo | 8 - tools/conan-profiles/vs-22-debug | 8 - tools/conan-profiles/vs-22-debug-ninja | 10 - tools/conan-profiles/vs-22-release | 8 - tools/conan-profiles/vs-22-release-ninja | 10 - tools/conan-profiles/vs-22-relwithdebinfo | 8 - 18 files changed, 735 insertions(+), 361 deletions(-) create mode 100644 CMake/conan_provider.cmake delete mode 100644 tools/conan-profiles/vs-19-debug delete mode 100644 tools/conan-profiles/vs-19-debug-ninja delete mode 100644 tools/conan-profiles/vs-19-release delete mode 100644 tools/conan-profiles/vs-19-release-ninja delete mode 100644 tools/conan-profiles/vs-19-relwithdebinfo delete mode 100644 tools/conan-profiles/vs-22-debug delete mode 100644 tools/conan-profiles/vs-22-debug-ninja delete mode 100644 tools/conan-profiles/vs-22-release delete mode 100644 tools/conan-profiles/vs-22-release-ninja delete mode 100644 tools/conan-profiles/vs-22-relwithdebinfo diff --git a/.github/workflows/build-game.yml b/.github/workflows/build-game.yml index d5dd96cc..dd38483e 100644 --- a/.github/workflows/build-game.yml +++ b/.github/workflows/build-game.yml @@ -56,8 +56,7 @@ jobs: echo "tools.system.package_manager:mode = install" > ~/.conan2/global.conf echo "tools.system.package_manager:sudo = True" >> ~/.conan2/global.conf conan remote add rigs-of-rods-deps https://conan.cloudsmith.io/rigs-of-rods/deps/ -f - conan install . -s build_type=Release -b missing -pr:b=default -c tools.cmake.cmaketoolchain:generator="Ninja" -of build - cmake --preset conan-release -DBUILD_MASTER_SERVER=ON + cmake . -GNinja -DCMAKE_BUILD_TYPE=Release -Bbuild -DCMAKE_PROJECT_TOP_LEVEL_INCLUDES=CMake/conan_provider.cmake -DBUILD_MASTER_SERVER=ON shell: bash - name: Build @@ -94,13 +93,12 @@ jobs: path: ~/.conan2 - name: Enable Developer Command Prompt - uses: ilammy/msvc-dev-cmd@v1.12.1 + uses: ilammy/msvc-dev-cmd@v1 - name: Configure run: | conan remote add rigs-of-rods-deps https://conan.cloudsmith.io/rigs-of-rods/deps/ -f - conan install . -b missing -pr:b=tools/conan-profiles/vs-19-release-ninja -pr=tools/conan-profiles/vs-19-release-ninja -of build - cmake --preset conan-release -DCMAKE_INSTALL_PREFIX=redist -DCREATE_CONTENT_FOLDER=ON + cmake . -GNinja -DCMAKE_BUILD_TYPE=Release -Bbuild -DCMAKE_PROJECT_TOP_LEVEL_INCLUDES=cmake/conan_provider.cmake -DCMAKE_INSTALL_PREFIX=redist -DCREATE_CONTENT_FOLDER=ON shell: cmd - name: Build @@ -115,7 +113,6 @@ jobs: name: Windows path: bin/Release/ - - name: Clean Conan pkgs run: conan cache clean "*" -sbd shell: cmd diff --git a/.gitignore b/.gitignore index 443d7854..74158c33 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ syntax: glob # build -CMake* .cache bin/* build*/* diff --git a/CMake/FixupBundle.cmake b/CMake/FixupBundle.cmake index e10b6d8e..02bd0430 100644 --- a/CMake/FixupBundle.cmake +++ b/CMake/FixupBundle.cmake @@ -1,5 +1,4 @@ include(BundleUtilities) -include(${BIN_DIR}/cmake/ConanBinDirs.cmake) if (APPLE) set(PLUGIN_EXTENSION "dylib") diff --git a/CMake/conan_provider.cmake b/CMake/conan_provider.cmake new file mode 100644 index 00000000..0d2be004 --- /dev/null +++ b/CMake/conan_provider.cmake @@ -0,0 +1,676 @@ +# The MIT License (MIT) +# +# Copyright (c) 2024 JFrog +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +set(CONAN_MINIMUM_VERSION 2.0.5) + +# Create a new policy scope and set the minimum required cmake version so the +# features behind a policy setting like if(... IN_LIST ...) behaves as expected +# even if the parent project does not specify a minimum cmake version or a minimum +# version less than this module requires (e.g. 3.0) before the first project() call. +# (see: https://cmake.org/cmake/help/latest/variable/CMAKE_PROJECT_TOP_LEVEL_INCLUDES.html) +# +# The policy-affecting calls like cmake_policy(SET...) or `cmake_minimum_required` only +# affects the current policy scope, i.e. between the PUSH and POP in this case. +# +# https://cmake.org/cmake/help/book/mastering-cmake/chapter/Policies.html#the-policy-stack +cmake_policy(PUSH) +cmake_minimum_required(VERSION 3.24) + + +function(detect_os os os_api_level os_sdk os_subsystem os_version) + # it could be cross compilation + message(STATUS "CMake-Conan: cmake_system_name=${CMAKE_SYSTEM_NAME}") + if(CMAKE_SYSTEM_NAME AND NOT CMAKE_SYSTEM_NAME STREQUAL "Generic") + if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + set(${os} Macos PARENT_SCOPE) + elseif(CMAKE_SYSTEM_NAME STREQUAL "QNX") + set(${os} Neutrino PARENT_SCOPE) + elseif(CMAKE_SYSTEM_NAME STREQUAL "CYGWIN") + set(${os} Windows PARENT_SCOPE) + set(${os_subsystem} cygwin PARENT_SCOPE) + elseif(CMAKE_SYSTEM_NAME MATCHES "^MSYS") + set(${os} Windows PARENT_SCOPE) + set(${os_subsystem} msys2 PARENT_SCOPE) + else() + set(${os} ${CMAKE_SYSTEM_NAME} PARENT_SCOPE) + endif() + if(CMAKE_SYSTEM_NAME STREQUAL "Android") + if(DEFINED ANDROID_PLATFORM) + string(REGEX MATCH "[0-9]+" _os_api_level ${ANDROID_PLATFORM}) + elseif(DEFINED CMAKE_SYSTEM_VERSION) + set(_os_api_level ${CMAKE_SYSTEM_VERSION}) + endif() + message(STATUS "CMake-Conan: android api level=${_os_api_level}") + set(${os_api_level} ${_os_api_level} PARENT_SCOPE) + endif() + if(CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS|tvOS|watchOS") + # CMAKE_OSX_SYSROOT contains the full path to the SDK for MakeFile/Ninja + # generators, but just has the original input string for Xcode. + if(NOT IS_DIRECTORY ${CMAKE_OSX_SYSROOT}) + set(_os_sdk ${CMAKE_OSX_SYSROOT}) + else() + if(CMAKE_OSX_SYSROOT MATCHES Simulator) + set(apple_platform_suffix simulator) + else() + set(apple_platform_suffix os) + endif() + if(CMAKE_OSX_SYSROOT MATCHES AppleTV) + set(_os_sdk "appletv${apple_platform_suffix}") + elseif(CMAKE_OSX_SYSROOT MATCHES iPhone) + set(_os_sdk "iphone${apple_platform_suffix}") + elseif(CMAKE_OSX_SYSROOT MATCHES Watch) + set(_os_sdk "watch${apple_platform_suffix}") + endif() + endif() + if(DEFINED os_sdk) + message(STATUS "CMake-Conan: cmake_osx_sysroot=${CMAKE_OSX_SYSROOT}") + set(${os_sdk} ${_os_sdk} PARENT_SCOPE) + endif() + if(DEFINED CMAKE_OSX_DEPLOYMENT_TARGET) + message(STATUS "CMake-Conan: cmake_osx_deployment_target=${CMAKE_OSX_DEPLOYMENT_TARGET}") + set(${os_version} ${CMAKE_OSX_DEPLOYMENT_TARGET} PARENT_SCOPE) + endif() + endif() + endif() +endfunction() + + +function(detect_arch arch) + # CMAKE_OSX_ARCHITECTURES can contain multiple architectures, but Conan only supports one. + # Therefore this code only finds one. If the recipes support multiple architectures, the + # build will work. Otherwise, there will be a linker error for the missing architecture(s). + if(DEFINED CMAKE_OSX_ARCHITECTURES) + string(REPLACE " " ";" apple_arch_list "${CMAKE_OSX_ARCHITECTURES}") + list(LENGTH apple_arch_list apple_arch_count) + if(apple_arch_count GREATER 1) + message(WARNING "CMake-Conan: Multiple architectures detected, this will only work if Conan recipe(s) produce fat binaries.") + endif() + endif() + if(CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS|tvOS|watchOS" AND NOT CMAKE_OSX_ARCHITECTURES STREQUAL "") + set(host_arch ${CMAKE_OSX_ARCHITECTURES}) + elseif(MSVC) + set(host_arch ${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}) + else() + set(host_arch ${CMAKE_SYSTEM_PROCESSOR}) + endif() + if(host_arch MATCHES "aarch64|arm64|ARM64") + set(_arch armv8) + elseif(host_arch MATCHES "armv7|armv7-a|armv7l|ARMV7") + set(_arch armv7) + elseif(host_arch MATCHES armv7s) + set(_arch armv7s) + elseif(host_arch MATCHES "i686|i386|X86") + set(_arch x86) + elseif(host_arch MATCHES "AMD64|amd64|x86_64|x64") + set(_arch x86_64) + endif() + message(STATUS "CMake-Conan: cmake_system_processor=${_arch}") + set(${arch} ${_arch} PARENT_SCOPE) +endfunction() + + +function(detect_cxx_standard cxx_standard) + set(${cxx_standard} ${CMAKE_CXX_STANDARD} PARENT_SCOPE) + if(CMAKE_CXX_EXTENSIONS) + set(${cxx_standard} "gnu${CMAKE_CXX_STANDARD}" PARENT_SCOPE) + endif() +endfunction() + + +macro(detect_gnu_libstdcxx) + # _conan_is_gnu_libstdcxx true if GNU libstdc++ + check_cxx_source_compiles(" + #include + #if !defined(__GLIBCXX__) && !defined(__GLIBCPP__) + static_assert(false); + #endif + int main(){}" _conan_is_gnu_libstdcxx) + + # _conan_gnu_libstdcxx_is_cxx11_abi true if C++11 ABI + check_cxx_source_compiles(" + #include + static_assert(sizeof(std::string) != sizeof(void*), \"using libstdc++\"); + int main () {}" _conan_gnu_libstdcxx_is_cxx11_abi) + + set(_conan_gnu_libstdcxx_suffix "") + if(_conan_gnu_libstdcxx_is_cxx11_abi) + set(_conan_gnu_libstdcxx_suffix "11") + endif() + unset (_conan_gnu_libstdcxx_is_cxx11_abi) +endmacro() + + +macro(detect_libcxx) + # _conan_is_libcxx true if LLVM libc++ + check_cxx_source_compiles(" + #include + #if !defined(_LIBCPP_VERSION) + static_assert(false); + #endif + int main(){}" _conan_is_libcxx) +endmacro() + + +function(detect_lib_cxx lib_cxx) + if(CMAKE_SYSTEM_NAME STREQUAL "Android") + message(STATUS "CMake-Conan: android_stl=${CMAKE_ANDROID_STL_TYPE}") + set(${lib_cxx} ${CMAKE_ANDROID_STL_TYPE} PARENT_SCOPE) + return() + endif() + + include(CheckCXXSourceCompiles) + + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") + detect_gnu_libstdcxx() + set(${lib_cxx} "libstdc++${_conan_gnu_libstdcxx_suffix}" PARENT_SCOPE) + elseif(CMAKE_CXX_COMPILER_ID MATCHES "AppleClang") + set(${lib_cxx} "libc++" PARENT_SCOPE) + elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT CMAKE_SYSTEM_NAME MATCHES "Windows") + # Check for libc++ + detect_libcxx() + if(_conan_is_libcxx) + set(${lib_cxx} "libc++" PARENT_SCOPE) + return() + endif() + + # Check for libstdc++ + detect_gnu_libstdcxx() + if(_conan_is_gnu_libstdcxx) + set(${lib_cxx} "libstdc++${_conan_gnu_libstdcxx_suffix}" PARENT_SCOPE) + return() + endif() + + # TODO: it would be an error if we reach this point + elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + # Do nothing - compiler.runtime and compiler.runtime_type + # should be handled separately: https://github.com/conan-io/cmake-conan/pull/516 + return() + else() + # TODO: unable to determine, ask user to provide a full profile file instead + endif() +endfunction() + + +function(detect_compiler compiler compiler_version compiler_runtime compiler_runtime_type) + if(DEFINED CMAKE_CXX_COMPILER_ID) + set(_compiler ${CMAKE_CXX_COMPILER_ID}) + set(_compiler_version ${CMAKE_CXX_COMPILER_VERSION}) + else() + if(NOT DEFINED CMAKE_C_COMPILER_ID) + message(FATAL_ERROR "C or C++ compiler not defined") + endif() + set(_compiler ${CMAKE_C_COMPILER_ID}) + set(_compiler_version ${CMAKE_C_COMPILER_VERSION}) + endif() + + message(STATUS "CMake-Conan: CMake compiler=${_compiler}") + message(STATUS "CMake-Conan: CMake compiler version=${_compiler_version}") + + if(_compiler MATCHES MSVC) + set(_compiler "msvc") + string(SUBSTRING ${MSVC_VERSION} 0 3 _compiler_version) + # Configure compiler.runtime and compiler.runtime_type settings for MSVC + if(CMAKE_MSVC_RUNTIME_LIBRARY) + set(_msvc_runtime_library ${CMAKE_MSVC_RUNTIME_LIBRARY}) + else() + set(_msvc_runtime_library MultiThreaded$<$:Debug>DLL) # default value documented by CMake + endif() + + set(_KNOWN_MSVC_RUNTIME_VALUES "") + list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreaded MultiThreadedDLL) + list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreadedDebug MultiThreadedDebugDLL) + list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreaded$<$:Debug> MultiThreaded$<$:Debug>DLL) + + # only accept the 6 possible values, otherwise we don't don't know to map this + if(NOT _msvc_runtime_library IN_LIST _KNOWN_MSVC_RUNTIME_VALUES) + message(FATAL_ERROR "CMake-Conan: unable to map MSVC runtime: ${_msvc_runtime_library} to Conan settings") + endif() + + # Runtime is "dynamic" in all cases if it ends in DLL + if(_msvc_runtime_library MATCHES ".*DLL$") + set(_compiler_runtime "dynamic") + else() + set(_compiler_runtime "static") + endif() + message(STATUS "CMake-Conan: CMake compiler.runtime=${_compiler_runtime}") + + # Only define compiler.runtime_type when explicitly requested + # If a generator expression is used, let Conan handle it conditional on build_type + if(NOT _msvc_runtime_library MATCHES ":Debug>") + if(_msvc_runtime_library MATCHES "Debug") + set(_compiler_runtime_type "Debug") + else() + set(_compiler_runtime_type "Release") + endif() + message(STATUS "CMake-Conan: CMake compiler.runtime_type=${_compiler_runtime_type}") + endif() + + unset(_KNOWN_MSVC_RUNTIME_VALUES) + + elseif(_compiler MATCHES AppleClang) + set(_compiler "apple-clang") + string(REPLACE "." ";" VERSION_LIST ${CMAKE_CXX_COMPILER_VERSION}) + list(GET VERSION_LIST 0 _compiler_version) + elseif(_compiler MATCHES Clang) + set(_compiler "clang") + string(REPLACE "." ";" VERSION_LIST ${CMAKE_CXX_COMPILER_VERSION}) + list(GET VERSION_LIST 0 _compiler_version) + elseif(_compiler MATCHES GNU) + set(_compiler "gcc") + string(REPLACE "." ";" VERSION_LIST ${CMAKE_CXX_COMPILER_VERSION}) + list(GET VERSION_LIST 0 _compiler_version) + endif() + + message(STATUS "CMake-Conan: [settings] compiler=${_compiler}") + message(STATUS "CMake-Conan: [settings] compiler.version=${_compiler_version}") + if (_compiler_runtime) + message(STATUS "CMake-Conan: [settings] compiler.runtime=${_compiler_runtime}") + endif() + if (_compiler_runtime_type) + message(STATUS "CMake-Conan: [settings] compiler.runtime_type=${_compiler_runtime_type}") + endif() + + set(${compiler} ${_compiler} PARENT_SCOPE) + set(${compiler_version} ${_compiler_version} PARENT_SCOPE) + set(${compiler_runtime} ${_compiler_runtime} PARENT_SCOPE) + set(${compiler_runtime_type} ${_compiler_runtime_type} PARENT_SCOPE) +endfunction() + + +function(detect_build_type build_type) + get_property(multiconfig_generator GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(NOT multiconfig_generator) + # Only set when we know we are in a single-configuration generator + # Note: we may want to fail early if `CMAKE_BUILD_TYPE` is not defined + set(${build_type} ${CMAKE_BUILD_TYPE} PARENT_SCOPE) + endif() +endfunction() + + +macro(set_conan_compiler_if_appleclang lang command output_variable) + if(CMAKE_${lang}_COMPILER_ID STREQUAL "AppleClang") + execute_process(COMMAND xcrun --find ${command} + OUTPUT_VARIABLE _xcrun_out OUTPUT_STRIP_TRAILING_WHITESPACE) + cmake_path(GET _xcrun_out PARENT_PATH _xcrun_toolchain_path) + cmake_path(GET CMAKE_${lang}_COMPILER PARENT_PATH _compiler_parent_path) + if ("${_xcrun_toolchain_path}" STREQUAL "${_compiler_parent_path}") + set(${output_variable} "") + endif() + unset(_xcrun_out) + unset(_xcrun_toolchain_path) + unset(_compiler_parent_path) + endif() +endmacro() + + +macro(append_compiler_executables_configuration) + set(_conan_c_compiler "") + set(_conan_cpp_compiler "") + set(_conan_rc_compiler "") + set(_conan_compilers_list "") + if(CMAKE_C_COMPILER) + set(_conan_c_compiler "\"c\":\"${CMAKE_C_COMPILER}\"") + set_conan_compiler_if_appleclang(C cc _conan_c_compiler) + list(APPEND _conan_compilers_list ${_conan_c_compiler}) + else() + message(WARNING "CMake-Conan: The C compiler is not defined. " + "Please define CMAKE_C_COMPILER or enable the C language.") + endif() + if(CMAKE_CXX_COMPILER) + set(_conan_cpp_compiler "\"cpp\":\"${CMAKE_CXX_COMPILER}\"") + set_conan_compiler_if_appleclang(CXX c++ _conan_cpp_compiler) + list(APPEND _conan_compilers_list ${_conan_cpp_compiler}) + else() + message(WARNING "CMake-Conan: The C++ compiler is not defined. " + "Please define CMAKE_CXX_COMPILER or enable the C++ language.") + endif() + if(CMAKE_RC_COMPILER) + set(_conan_rc_compiler "\"rc\":\"${CMAKE_RC_COMPILER}\"") + list(APPEND _conan_compilers_list ${_conan_rc_compiler}) + # Not necessary to warn if RC not defined + endif() + if(NOT "x${_conan_compilers_list}" STREQUAL "x") + string(REPLACE ";" "," _conan_compilers_list "${_conan_compilers_list}") + string(APPEND profile "tools.build:compiler_executables={${_conan_compilers_list}}\n") + endif() + unset(_conan_c_compiler) + unset(_conan_cpp_compiler) + unset(_conan_rc_compiler) + unset(_conan_compilers_list) +endmacro() + + +function(detect_host_profile output_file) + detect_os(os os_api_level os_sdk os_subsystem os_version) + detect_arch(arch) + detect_compiler(compiler compiler_version compiler_runtime compiler_runtime_type) + detect_cxx_standard(compiler_cppstd) + detect_lib_cxx(compiler_libcxx) + detect_build_type(build_type) + + set(profile "") + string(APPEND profile "[settings]\n") + if(arch) + string(APPEND profile arch=${arch} "\n") + endif() + if(os) + string(APPEND profile os=${os} "\n") + endif() + if(os_api_level) + string(APPEND profile os.api_level=${os_api_level} "\n") + endif() + if(os_version) + string(APPEND profile os.version=${os_version} "\n") + endif() + if(os_sdk) + string(APPEND profile os.sdk=${os_sdk} "\n") + endif() + if(os_subsystem) + string(APPEND profile os.subsystem=${os_subsystem} "\n") + endif() + if(compiler) + string(APPEND profile compiler=${compiler} "\n") + endif() + if(compiler_version) + string(APPEND profile compiler.version=${compiler_version} "\n") + endif() + if(compiler_runtime) + string(APPEND profile compiler.runtime=${compiler_runtime} "\n") + endif() + if(compiler_runtime_type) + string(APPEND profile compiler.runtime_type=${compiler_runtime_type} "\n") + endif() + if(compiler_cppstd) + string(APPEND profile compiler.cppstd=${compiler_cppstd} "\n") + endif() + if(compiler_libcxx) + string(APPEND profile compiler.libcxx=${compiler_libcxx} "\n") + endif() + if(build_type) + string(APPEND profile "build_type=${build_type}\n") + endif() + + if(NOT DEFINED output_file) + set(file_name "${CMAKE_BINARY_DIR}/profile") + else() + set(file_name ${output_file}) + endif() + + string(APPEND profile "[conf]\n") + string(APPEND profile "tools.cmake.cmaketoolchain:generator=${CMAKE_GENERATOR}\n") + + # propagate compilers via profile + append_compiler_executables_configuration() + + if(os STREQUAL "Android") + string(APPEND profile "tools.android:ndk_path=${CMAKE_ANDROID_NDK}\n") + endif() + + message(STATUS "CMake-Conan: Creating profile ${file_name}") + file(WRITE ${file_name} ${profile}) + message(STATUS "CMake-Conan: Profile: \n${profile}") +endfunction() + + +function(conan_profile_detect_default) + message(STATUS "CMake-Conan: Checking if a default profile exists") + execute_process(COMMAND ${CONAN_COMMAND} profile path default + RESULT_VARIABLE return_code + OUTPUT_VARIABLE conan_stdout + ERROR_VARIABLE conan_stderr + ECHO_ERROR_VARIABLE # show the text output regardless + ECHO_OUTPUT_VARIABLE + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + if(NOT ${return_code} EQUAL "0") + message(STATUS "CMake-Conan: The default profile doesn't exist, detecting it.") + execute_process(COMMAND ${CONAN_COMMAND} profile detect + RESULT_VARIABLE return_code + OUTPUT_VARIABLE conan_stdout + ERROR_VARIABLE conan_stderr + ECHO_ERROR_VARIABLE # show the text output regardless + ECHO_OUTPUT_VARIABLE + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + endif() +endfunction() + + +function(conan_install) + cmake_parse_arguments(ARGS conan_args ${ARGN}) + set(conan_output_folder ${CMAKE_BINARY_DIR}/conan) + # Invoke "conan install" with the provided arguments + set(conan_args ${conan_args} -of=${conan_output_folder}) + message(STATUS "CMake-Conan: conan install ${CMAKE_SOURCE_DIR} ${conan_args} ${ARGN}") + + + # In case there was not a valid cmake executable in the PATH, we inject the + # same we used to invoke the provider to the PATH + if(DEFINED PATH_TO_CMAKE_BIN) + set(old_path $ENV{PATH}) + set(ENV{PATH} "$ENV{PATH}:${PATH_TO_CMAKE_BIN}") + endif() + + execute_process(COMMAND ${CONAN_COMMAND} install ${CMAKE_SOURCE_DIR} ${conan_args} ${ARGN} --format=json + RESULT_VARIABLE return_code + OUTPUT_VARIABLE conan_stdout + ERROR_VARIABLE conan_stderr + ECHO_ERROR_VARIABLE # show the text output regardless + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + + if(DEFINED PATH_TO_CMAKE_BIN) + set(ENV{PATH} "${old_path}") + endif() + + if(NOT "${return_code}" STREQUAL "0") + message(FATAL_ERROR "Conan install failed='${return_code}'") + endif() + + # the files are generated in a folder that depends on the layout used, if + # one is specified, but we don't know a priori where this is. + # TODO: this can be made more robust if Conan can provide this in the json output + string(JSON conan_generators_folder GET "${conan_stdout}" graph nodes 0 generators_folder) + cmake_path(CONVERT ${conan_generators_folder} TO_CMAKE_PATH_LIST conan_generators_folder) + + message(STATUS "CMake-Conan: CONAN_GENERATORS_FOLDER=${conan_generators_folder}") + set_property(GLOBAL PROPERTY CONAN_GENERATORS_FOLDER "${conan_generators_folder}") + # reconfigure on conanfile changes + string(JSON conanfile GET "${conan_stdout}" graph nodes 0 label) + message(STATUS "CMake-Conan: CONANFILE=${CMAKE_SOURCE_DIR}/${conanfile}") + set_property(DIRECTORY ${CMAKE_SOURCE_DIR} APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/${conanfile}") + # success + set_property(GLOBAL PROPERTY CONAN_INSTALL_SUCCESS TRUE) + +endfunction() + + +function(conan_get_version conan_command conan_current_version) + execute_process( + COMMAND ${conan_command} --version + OUTPUT_VARIABLE conan_output + RESULT_VARIABLE conan_result + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(conan_result) + message(FATAL_ERROR "CMake-Conan: Error when trying to run Conan") + endif() + + string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" conan_version ${conan_output}) + set(${conan_current_version} ${conan_version} PARENT_SCOPE) +endfunction() + + +function(conan_version_check) + set(options ) + set(one_value_args MINIMUM CURRENT) + set(multi_value_args ) + cmake_parse_arguments(conan_version_check + "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) + + if(NOT conan_version_check_MINIMUM) + message(FATAL_ERROR "CMake-Conan: Required parameter MINIMUM not set!") + endif() + if(NOT conan_version_check_CURRENT) + message(FATAL_ERROR "CMake-Conan: Required parameter CURRENT not set!") + endif() + + if(conan_version_check_CURRENT VERSION_LESS conan_version_check_MINIMUM) + message(FATAL_ERROR "CMake-Conan: Conan version must be ${conan_version_check_MINIMUM} or later") + endif() +endfunction() + + +macro(construct_profile_argument argument_variable profile_list) + set(${argument_variable} "") + if("${profile_list}" STREQUAL "CONAN_HOST_PROFILE") + set(_arg_flag "--profile:host=") + elseif("${profile_list}" STREQUAL "CONAN_BUILD_PROFILE") + set(_arg_flag "--profile:build=") + endif() + + set(_profile_list "${${profile_list}}") + list(TRANSFORM _profile_list REPLACE "auto-cmake" "${CMAKE_BINARY_DIR}/conan_host_profile") + list(TRANSFORM _profile_list PREPEND ${_arg_flag}) + set(${argument_variable} ${_profile_list}) + + unset(_arg_flag) + unset(_profile_list) +endmacro() + + +macro(conan_provide_dependency method package_name) + set_property(GLOBAL PROPERTY CONAN_PROVIDE_DEPENDENCY_INVOKED TRUE) + get_property(_conan_install_success GLOBAL PROPERTY CONAN_INSTALL_SUCCESS) + if(NOT _conan_install_success) + find_program(CONAN_COMMAND "conan" REQUIRED) + conan_get_version(${CONAN_COMMAND} CONAN_CURRENT_VERSION) + conan_version_check(MINIMUM ${CONAN_MINIMUM_VERSION} CURRENT ${CONAN_CURRENT_VERSION}) + message(STATUS "CMake-Conan: first find_package() found. Installing dependencies with Conan") + if("default" IN_LIST CONAN_HOST_PROFILE OR "default" IN_LIST CONAN_BUILD_PROFILE) + conan_profile_detect_default() + endif() + if("auto-cmake" IN_LIST CONAN_HOST_PROFILE) + detect_host_profile(${CMAKE_BINARY_DIR}/conan_host_profile) + endif() + construct_profile_argument(_host_profile_flags CONAN_HOST_PROFILE) + construct_profile_argument(_build_profile_flags CONAN_BUILD_PROFILE) + if(EXISTS "${CMAKE_SOURCE_DIR}/conanfile.py") + file(READ "${CMAKE_SOURCE_DIR}/conanfile.py" outfile) + if(NOT "${outfile}" MATCHES ".*CMakeDeps.*") + message(WARNING "Cmake-conan: CMakeDeps generator was not defined in the conanfile") + endif() + set(generator "") + elseif (EXISTS "${CMAKE_SOURCE_DIR}/conanfile.txt") + file(READ "${CMAKE_SOURCE_DIR}/conanfile.txt" outfile) + if(NOT "${outfile}" MATCHES ".*CMakeDeps.*") + message(WARNING "Cmake-conan: CMakeDeps generator was not defined in the conanfile. " + "Please define the generator as it will be mandatory in the future") + endif() + set(generator "-g;CMakeDeps") + endif() + get_property(_multiconfig_generator GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(NOT _multiconfig_generator) + message(STATUS "CMake-Conan: Installing single configuration ${CMAKE_BUILD_TYPE}") + conan_install(${_host_profile_flags} ${_build_profile_flags} ${CONAN_INSTALL_ARGS} ${generator}) + else() + message(STATUS "CMake-Conan: Installing both Debug and Release") + conan_install(${_host_profile_flags} ${_build_profile_flags} -s build_type=Release ${CONAN_INSTALL_ARGS} ${generator}) + conan_install(${_host_profile_flags} ${_build_profile_flags} -s build_type=Debug ${CONAN_INSTALL_ARGS} ${generator}) + endif() + unset(_host_profile_flags) + unset(_build_profile_flags) + unset(_multiconfig_generator) + unset(_conan_install_success) + else() + message(STATUS "CMake-Conan: find_package(${ARGV1}) found, 'conan install' already ran") + unset(_conan_install_success) + endif() + + get_property(_conan_generators_folder GLOBAL PROPERTY CONAN_GENERATORS_FOLDER) + + # Ensure that we consider Conan-provided packages ahead of any other, + # irrespective of other settings that modify the search order or search paths + # This follows the guidelines from the find_package documentation + # (https://cmake.org/cmake/help/latest/command/find_package.html): + # find_package ( PATHS paths... NO_DEFAULT_PATH) + # find_package () + + # Filter out `REQUIRED` from the argument list, as the first call may fail + set(_find_args_${package_name} "${ARGN}") + list(REMOVE_ITEM _find_args_${package_name} "REQUIRED") + if(NOT "MODULE" IN_LIST _find_args_${package_name}) + find_package(${package_name} ${_find_args_${package_name}} BYPASS_PROVIDER PATHS "${_conan_generators_folder}" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) + unset(_find_args_${package_name}) + endif() + + # Invoke find_package a second time - if the first call succeeded, + # this will simply reuse the result. If not, fall back to CMake default search + # behaviour, also allowing modules to be searched. + if(NOT ${package_name}_FOUND) + list(FIND CMAKE_MODULE_PATH "${_conan_generators_folder}" _index) + if(_index EQUAL -1) + list(PREPEND CMAKE_MODULE_PATH "${_conan_generators_folder}") + endif() + unset(_index) + find_package(${package_name} ${ARGN} BYPASS_PROVIDER) + list(REMOVE_ITEM CMAKE_MODULE_PATH "${_conan_generators_folder}") + endif() +endmacro() + + +cmake_language( + SET_DEPENDENCY_PROVIDER conan_provide_dependency + SUPPORTED_METHODS FIND_PACKAGE +) + + +macro(conan_provide_dependency_check) + set(_conan_provide_dependency_invoked FALSE) + get_property(_conan_provide_dependency_invoked GLOBAL PROPERTY CONAN_PROVIDE_DEPENDENCY_INVOKED) + if(NOT _conan_provide_dependency_invoked) + message(WARNING "Conan is correctly configured as dependency provider, " + "but Conan has not been invoked. Please add at least one " + "call to `find_package()`.") + if(DEFINED CONAN_COMMAND) + # supress warning in case `CONAN_COMMAND` was specified but unused. + set(_conan_command ${CONAN_COMMAND}) + unset(_conan_command) + endif() + endif() + unset(_conan_provide_dependency_invoked) +endmacro() + + +# Add a deferred call at the end of processing the top-level directory +# to check if the dependency provider was invoked at all. +cmake_language(DEFER DIRECTORY "${CMAKE_SOURCE_DIR}" CALL conan_provide_dependency_check) + +# Configurable variables for Conan profiles +set(CONAN_HOST_PROFILE "default;auto-cmake" CACHE STRING "Conan host profile") +set(CONAN_BUILD_PROFILE "default" CACHE STRING "Conan build profile") +set(CONAN_INSTALL_ARGS "--build=missing" CACHE STRING "Command line arguments for conan install") + +find_program(_cmake_program NAMES cmake NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_FIND_ROOT_PATH) +if(NOT _cmake_program) + get_filename_component(PATH_TO_CMAKE_BIN "${CMAKE_COMMAND}" DIRECTORY) + set(PATH_TO_CMAKE_BIN "${PATH_TO_CMAKE_BIN}" CACHE INTERNAL "Path where the CMake executable is") +endif() + +cmake_policy(POP) diff --git a/CMakeLists.txt b/CMakeLists.txt index d84ae0c7..97566410 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -194,17 +194,6 @@ foreach( EXE ${EXE_LIST} ) if (WIN32) install(TARGETS ${EXE} DESTINATION .) - - # add a post-build command to copy DLLs beside the executable - add_custom_command( - TARGET ${EXE} - POST_BUILD - COMMAND ${CMAKE_COMMAND} - -DEXECUTABLE="$" - -DBIN_DIR="${CMAKE_BINARY_DIR}" - -DLIB_DIR="$" - -P "${CMAKE_SOURCE_DIR}/CMake/FixupBundle.cmake" - ) endif () endforeach () diff --git a/conanfile.py b/conanfile.py index e70fea64..dfe32fd8 100644 --- a/conanfile.py +++ b/conanfile.py @@ -26,7 +26,7 @@ def requirements(self): if not self.options.system_pkgs: self.requires("boost/1.83.0") - self.requires("bullet3/3.25@anotherfoxguy/patched") + self.requires("bullet3/3.25@anotherfoxguy/patched") self.requires("sdl/2.30.7") self.requires("ogg/1.3.5") self.requires("vorbis/1.3.7") @@ -49,26 +49,13 @@ def generate(self): deps.configuration = "RelWithDebInfo" deps.generate() - bindirs = [] for dep in self.dependencies.values(): - bindirs += dep.cpp_info.bindirs - - bindirs_win = [] - for dir in bindirs: - bindirs_win.append(os.path.join(dir, f"{self.settings.build_type}")) - - conan_data = 'set(CONAN_BIN_DIRS "%s;%s")\n' % ( - ";".join(bindirs).replace("\\", "/"), - ";".join(bindirs_win).replace("\\", "/"), - ) - - save( - self, - os.path.join(self.build_folder, "cmake", "ConanBinDirs.cmake"), - conan_data, - ) - - if self.settings.os == "Windows": - libdir = os.path.join(self.source_folder, "bin", f"{self.settings.build_type}") - for f in self.dependencies["ogre3d-next"].cpp_info.bindirs: - copy(self, "*.dll", f, libdir, False) + for f in dep.cpp_info.bindirs: + self.cp_data(f) + for f in dep.cpp_info.libdirs: + self.cp_data(f) + + def cp_data(self, src): + bindir = os.path.join(self.source_folder, "bin", f"{self.settings.build_type}") + copy(self, "*.dll", src, bindir, False) + copy(self, "*.so*", src, bindir, False) diff --git a/docs/Building.md b/docs/Building.md index f93c9f56..d095b3c8 100644 --- a/docs/Building.md +++ b/docs/Building.md @@ -1,49 +1,56 @@ ## About -How to build on Windows is on other [page](BuildingVS.md) _(way longer and more difficult)_. - -This page describes how to *quickly* build Stunt Rally 3 on **Linux** (Debian-based), using provided `.py` script. -_There is a detailed page [Building-old](Building-old.md) with all steps done manually without .py script._ +How to build on Windows is on other [page](BuildingVS.md). It should work on Debian-based (like Ubuntu etc). Tested on GNU/Linux: Debian 12 and Kubuntu 20.04. -_By default CMakeLists.txt is using Conan for our [CI builds](https://github.com/stuntrally/stuntrally3/actions) (and its CMake setup from this [PR here](https://github.com/stuntrally/stuntrally3/pull/1))._ - ## 1. Basic setup Basic setup for building C++ etc. Start in terminal: `sudo apt-get -y install g++ binutils gdb git make cmake ninja-build` -## 2. Ogre dependencies +Also install [Conan](https://conan.io/downloads) -Setup for Ogre dependencies (as in [here](https://github.com/OGRECave/ogre-next#dependencies-linux)): -`sudo apt-get -y install libfreetype6-dev libfreeimage-dev libzzip-dev libxrandr-dev libxcb-randr0-dev libxaw7-dev freeglut3-dev libgl1-mesa-dev libglu1-mesa-dev libx11-xcb-dev libxcb-keysyms1-dev doxygen graphviz python-clang libsdl2-dev rapidjson-dev` +## 2. Clone SR3 -## 3. SR3 dependencies +First create a new folder `stuntrally3` e.g. in your home dir (`mkdir stuntrally3`), and go into it (`cd stuntrally3`). -Needed to build SR3 itself: -`sudo apt-get -y install libbullet-dev libbullet-extras-dev libtinyxml2-dev libenet-dev libogg-dev libvorbis-dev libopenal-dev libboost-system-dev libboost-thread-dev` +Clone SR3 (this repo) and [SR3 tracks](https://github.com/stuntrally/tracks3) inside `data/tracks`: +``` +git clone https://github.com/stuntrally/stuntrally3.git . +git clone https://github.com/stuntrally/tracks3.git data/tracks +``` -## 4. Build all +## 3. Add the conan remote -First create a new folder `dev/` e.g. in your home dir (`mkdir dev`), and go into it (`cd dev/`). +Open up a terminal and run the following command: +`conan remote add rigs-of-rods-deps https://conan.cloudsmith.io/rigs-of-rods/deps/` -See remarks on top of [build-sr3-Linux.py](../build-sr3-Linux.py) file (about 6.5 GB needed etc). +## 4. Running CMake + +Run the following command in the `stuntrally3` folder to generate the ninja build files: + +```bash +cmake . -Bbuild \ + -GNinja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_PROJECT_TOP_LEVEL_INCLUDES=CMake/conan_provider.cmake +``` -Download just the [build-sr3-Linux.py](../build-sr3-Linux.py) file, and put it inside `dev/`. +## 5. Compiling -Start this Python script, e.g. in terminal by: -`python3 ./build-sr3-Linux.py` +cd into the build directory and run the following command: +`ninja` -## 5. Start StuntRally3 +## 6. Start StuntRally3 -If build succeeded, go into `sr3/bin/Release` +If build succeeded, go into `stuntrally3/bin/Release` and start the executable: `./sr-editor3` - for SR3 Track Editor `./stuntrally3` - for SR3 game -## 6. Running +## 7. Running For any crashes or issues, check logs inside: `/home/user/.config/stuntrally3` diff --git a/docs/BuildingVS.md b/docs/BuildingVS.md index e4b1bd10..b9be0bdb 100644 --- a/docs/BuildingVS.md +++ b/docs/BuildingVS.md @@ -1,190 +1,17 @@ -## About - -This page describes how to compile Stunt Rally 3: -- on **Windows** (10 only tested) -- buiding first **all dependencies from sources** -- using **VS** 2019 - Could be older but seems that newer versions aren't yet tested for Ogre-Next at least. - There is a free Visual Studio Community edition [here](https://visualstudio.microsoft.com/downloads/), it should work okay (didn't check) - (_Visual Studio is a big commercial solution though, way too big and bloated_) - -Surely this is a **long** and somewhat **tedious** process, it can take **2 hours** or more to complete ⚠️. - -_SR3 depends on Ogre-Next 3.0, and MyGui fork for it which aren't released or packaged at all._ -_Other alternative could be getting Conan to work, or vcpkg. This is not done for SR3 ([WIP PR here](https://github.com/stuntrally/stuntrally3/pull/1))._ - -_An easier project to build is my [ogre3ter-demo](https://github.com/cryham/ogre3ter-demo/) it only uses Ogre-Next._ - ## 1. Getting Dependencies -We need tools: [Git](https://git-scm.com/downloads) and [CMake](https://cmake.org/download/) installed. - -This table lists all needed dependencies (libraries) for SR3: - -| **Library** | Version used | Website | Downloads | -|-------------|--------------|--------------------------------------------|---------------------------------------------------------------------------| -| tinyxml2 | 9.0.0 | | [Downloads](https://github.com/leethomason/tinyxml2/tags) | -| Bullet | 3.25 | | [Downloads](https://github.com/bulletphysics/bullet3/releases) | -| Boost | 1.81 | | [Downloads](https://sourceforge.net/projects/boost/files/boost-binaries/) | -| Enet | 1.3.17 | | [Downloads](https://github.com/lsalzman/enet/tags) | -| Ogg | 1.3.5 | | [Downloads](https://xiph.org/downloads/) | -| Vorbis | 1.3.7 | | [Downloads](https://xiph.org/downloads/) | -| OpenAL Soft | 1.23.1 | | [tags](https://github.com/kcat/openal-soft/tags) | -| | | | | -| Ogre-Next
has SDL2 | 3.0 | | [git repo](https://github.com/OGRECave/ogre-next) not to Download, script | -| MyGui-next | 3.? | | [git repo](https://github.com/cryham/mygui-next/) | - -Newer, latest versions can be used. -Only Ogre-Next and MyGui-next are special cases, info in own, later sections. - -## 2. Building dependencies - -### 2.1 - -**Ogre-Next** soruces are downloaded (using Git) by a script, which will also get its dependencies like SDL2 and build them and itself. -**MyGui-next** is my fork, it needs downloaded .zip with sources or cloned by Git. -Both are explained later, for now no need to do anything. - -### 2.2 - -For **Boost**, since I used VS 2019 14.2 (upgrade 2, not 3 yet) I downloaded boost_1_81_0-msvc-14.2-64.exe to match it. -For me this e.g. 14.2 is shown in *VS Installer* app on tab *Individual components* as: C++ Modules for v142 build tools (x64/x86) -and are present and picked in Project properties, in General tab, Platform Toolset. -This is an `.exe` that will extract Boost files to a typed folder. - -### 2.3 - -**Bullet** is different, it has a file [`build_visual_studio_vr_pybullet_double_dynamic.bat`](https://github.com/bulletphysics/bullet3/blob/master/build_visual_studio_vr_pybullet_double_dynamic.bat). -Important line in this `.bat` is starting with: `premake4 --dynamic-runtime --double ` -Meaning bullet will use _double_ types and dynamic DLL for runtime. -I recommend removing `--double` from it, it's not needed and works slower on old PCs. - -Start this `.bat` file, it that will generate a folder bullet3\vs2010\ with `0_Bullet3Solution.sln` file, -open it and build with your VS (first convert dialog will show). -You can build whole solution, there is more stuff. -We definitely need to build: BulletCollision, BulletDynamics, BulletFileLoader, BulletWorldImporter, LinearMath. -_Those are older bullet 2 libs (bt* names), not the bullet 3 new (b3* names)._ - -### 2.4 - -The rest: **tinyxml2, Enet, Ogg, Vorbis, OpenAL Soft**, for each: -download `.zip` file with sources for latest stable release version and extract in root folder e.g. `c:\dev` -Resulting in e.g. these dirs: -``` -c:\dev\ - bullet3-3.25 - enet-1.3.17 - libogg-1.3.5 - libvorbis-1.3.7 - openal-soft-1.23.1 - tinyxml2-9.0.0 -``` - -These libs have `CMakeLists.txt` file inside, which means we need to: -**for each lib**: start CMake-Gui, pick sources folder to where you extracted it -e.g. `c:\dev\enet-1.3.17`, and then new `build` folder inside e.g. to `c:\dev\enet-1.3.17\build` -After that set, press Configure, twice, and lastly Generate. -Now there should be a `.sln` file inside build\ dir. - -Open it (with your VS) and build solution. -We need to build `Release x64` (64 bit compiler, Release configuration), _later if needed Debug for any issue finding._ - -Many of these libraries will build just as _Static library .lib_. That's okay, _these will link with our exe, not be in own DLL_. - -For **enet** also these system libs were needed to add in Properties - Linker input: -winmm.lib;Ws2_32.lib; - -Very **important** thing is that all should use in: -Project Properties - C++ - Code Generation - Runtime Library: **Multi Threaded DLL**, and for Debug same but with Debug DLL. -This was set so in all but best to be sure. _Failing that would lead to many linker issues much later when linking SR3._ +We need the following tools for building SR3: +- [Visual Studio 2019 Community](https://visualstudio.microsoft.com/downloads/) (In the "Workloads" tab enable **Desktop development with C++** and in "Individual components" enable "Windows Universal CRT SDK") -## 3. Building Ogre-Next +- [CMake](https://cmake.org/download/) -Building Ogre-Next from sources, using [scripts](https://github.com/OGRECave/ogre-next/tree/master/Scripts/BuildScripts/output). +- [Conan](https://conan.io/downloads) -Save the file [build_ogre_Visual_Studio_16_2019_x64.bat](https://raw.githubusercontent.com/OGRECave/ogre-next/master/Scripts/BuildScripts/output/build_ogre_Visual_Studio_16_2019_x64.bat) -and put it inside our root folder `c:\dev` +- [Git](https://git-scm.com/) (Leave all options to their defaults) -We need Ogre-Next branch v3.0 now. So edit `build_ogre_Visual_Studio_16_2019_x64.bat` and replace in this top line: -`set OGRE_BRANCH_NAME=master"` to `set OGRE_BRANCH_NAME=v3-0` and save file. -Also in same file we have to add `-D OGRE_BUILD_COMPONENT_PLANAR_REFLECTIONS=1` -in 2 lines starting with `cmake -D `... -So they should start like: -`cmake -D OGRE_BUILD_COMPONENT_PLANAR_REFLECTIONS=1 `... - -Then open cmd and start the `.bat`. - -This should succeed after a longer while and build Ogre-Next with its dependencies. - -If so you can start and check Ogre demos and samples inside: - `c:\dev\Ogre\ogre-next\build\bin\Release\` - It's good to check if they work before continuing. - -### 3.1 (Optional) Ogre components, rebuild -- Now *not needed*, optional step. We need to have below 2 components built with Ogre. - - In `c:\dev\Ogre\ogre-next\build\` - edit the file `CMakeCache.txt` and be sure the lines: - ``` - OGRE_BUILD_COMPONENT_ATMOSPHERE:BOOL=ON - ... - OGRE_BUILD_COMPONENT_PLANAR_REFLECTIONS:BOOL=ON - ``` - have ON at end. _At least PLANAR_REFLECTIONS is not by default._ - -- Now **build Ogre** again. So, in all needed configurations, by opening solution - `OGRE-Next.sln` from above `build\` dir, and building in VS. - This will take less time than first in cmd. - ----- -- _Optional note_. - This (rebuild Ogre) step is also needed, after updating Ogre sources to latest (`git pull` in `Ogre/ogre-next/`). - Caution: if this was done later, after building MyGui and/or StuntRally3, - then you need to rebuild also MyGui and then StuntRally3 too. - -- _Optional_ for Debug only. - For Debug build to be usable we have to comment out this `assert`, - (needs rebuilding Ogre-Next after), - I added // at start in `OgreNode.h` (line was 681, could change): - -``` - virtual_l2 FORCEINLINE const Matrix4 &_getFullTransform() const - { -#if OGRE_DEBUG_MODE >= OGRE_DEBUG_MEDIUM - //assert( !mCachedTransformOutOfDate ); -#endif -``` - -## 4. Building MyGui-Next - -MyGui-Next is my fork of MyGui on branch `ogre3`. -I follow its build guide [here](https://github.com/cryham/mygui-next/tree/ogre3). -_It isn't the latest, and was also based on fork._ - -No need to set, it is so by default: - - MYGUI_RENDERSYSTEM: 8 - Ogre 3.x - - MYGUI_USE_FREETYPE: yes - - all MYGUI_BUILD*: no - - MYGUI_STATIC: no, MYGUI_DONT_USE_OBSOLETE: no - -You could donwload .zip with sources, but `git clone` is better, -since you can later do `git pull` to get any updates. - -Inside `c:\dev\` -``` -git clone https://github.com/cryham/mygui-next --branch ogre3 --single-branch -``` -Follow its build guide [here](https://github.com/cryham/mygui-next/tree/ogre3#windows). -This _needs_ renaming few cmake files in it. - -Open CMake-Gui, pick sources `c:\dev\mygui-next`, build to `c:\dev\mygui-next\build`. -Press Configure twice, then Generate. - -We need Release build, _only if Release fails, then Debug too._ - -## 6. Clone SR3 +## 2. Clone SR3 Clone SR3 (this repo) and [SR3 tracks](https://github.com/stuntrally/tracks3) inside `data/tracks`: In `c:\dev\` @@ -193,21 +20,20 @@ git clone https://github.com/stuntrally/stuntrally3.git sr3 cd sr3/data git clone https://github.com/stuntrally/tracks3.git tracks ``` -## 7. Build SR3 -Rename the files, replacing them (best to keep copies): -`CMakeLists-WindowsRelease.txt` to: -`CMakeLists.txt` -and -`\bin\Release\plugins_Windows.cfg` to: -`\bin\Release\plugins.cfg` +## 3. Add the conan remote -Open CMake-Gui, pick sources `c:\dev\sr3` and build as `c:\dev\sr3\build`. +Open up a terminal and run the following command: +`conan remote add rigs-of-rods-deps https://conan.cloudsmith.io/rigs-of-rods/deps/` -> If doing a Debug build, then do same but use: -> `CMakeLists-WindowsDebug.txt` and -> `bin\Debug\plugins_Windows.cfg` -> and choose a _different_ build dir e.g. `c:\dev\sr3\buildDebug` +## 4. Build SR3 + +Open CMake-Gui, pick sources `c:\dev\sr3` and build as `c:\dev\sr3\build`. + +Click the *Add Entry* and add the following values: +Name: `CMAKE_PROJECT_TOP_LEVEL_INCLUDES` +Type: `filepath` +Value: `cmake/conan_provider.cmake` Press Configure twice. If it fails, then probably need to adjust some paths in CMake files. @@ -217,25 +43,7 @@ pick `Release x64` configuration and build it. This should produce valid *.exe files - -## 8. Start StuntRally3 - -Copy into `c:\dev\sr3\bin\Release\` -**all** needed `*.dll` files from previously built dependencies, we need: -``` -MyGUIEngine.dll -OgreHlmsPbs.dll -OgreHlmsUnlit.dll -OgreMain.dll -OgreOverlay.dll -OgrePlanarReflections.dll -OpenAL32.dll -Plugin_ParticleFX.dll -RenderSystem_Direct3D11.dll (not used yet) -RenderSystem_GL3Plus.dll -SDL2.dll -amd_ags_x64.dll (got from internet) -``` +## 5. Start StuntRally3 If build succeeded, start: `c:\dev\sr3\bin\Release\StuntRally3.exe` - for SR3 game diff --git a/tools/conan-profiles/vs-19-debug b/tools/conan-profiles/vs-19-debug deleted file mode 100644 index e2c293d9..00000000 --- a/tools/conan-profiles/vs-19-debug +++ /dev/null @@ -1,8 +0,0 @@ -[settings] -os=Windows -arch=x86_64 -compiler=msvc -compiler.version=192 -compiler.runtime=dynamic -compiler.runtime_type=Debug -build_type=Debug diff --git a/tools/conan-profiles/vs-19-debug-ninja b/tools/conan-profiles/vs-19-debug-ninja deleted file mode 100644 index f3cdbf4a..00000000 --- a/tools/conan-profiles/vs-19-debug-ninja +++ /dev/null @@ -1,10 +0,0 @@ -[settings] -os=Windows -arch=x86_64 -compiler=msvc -compiler.version=192 -compiler.runtime=dynamic -compiler.runtime_type=Debug -build_type=Debug -[conf] -tools.cmake.cmaketoolchain:generator=Ninja \ No newline at end of file diff --git a/tools/conan-profiles/vs-19-release b/tools/conan-profiles/vs-19-release deleted file mode 100644 index 724f12a9..00000000 --- a/tools/conan-profiles/vs-19-release +++ /dev/null @@ -1,8 +0,0 @@ -[settings] -os=Windows -arch=x86_64 -compiler=msvc -compiler.version=192 -compiler.runtime=dynamic -compiler.runtime_type=Release -build_type=Release diff --git a/tools/conan-profiles/vs-19-release-ninja b/tools/conan-profiles/vs-19-release-ninja deleted file mode 100644 index 24be6d9f..00000000 --- a/tools/conan-profiles/vs-19-release-ninja +++ /dev/null @@ -1,10 +0,0 @@ -[settings] -os=Windows -arch=x86_64 -compiler=msvc -compiler.version=192 -compiler.runtime=dynamic -compiler.runtime_type=Release -build_type=Release -[conf] -tools.cmake.cmaketoolchain:generator=Ninja \ No newline at end of file diff --git a/tools/conan-profiles/vs-19-relwithdebinfo b/tools/conan-profiles/vs-19-relwithdebinfo deleted file mode 100644 index 4749266f..00000000 --- a/tools/conan-profiles/vs-19-relwithdebinfo +++ /dev/null @@ -1,8 +0,0 @@ -[settings] -os=Windows -os_build=Windows -arch=x86_64 -arch_build=x86_64 -compiler=Visual Studio -compiler.version=16 -build_type=RelWithDebInfo \ No newline at end of file diff --git a/tools/conan-profiles/vs-22-debug b/tools/conan-profiles/vs-22-debug deleted file mode 100644 index 30a6d9b0..00000000 --- a/tools/conan-profiles/vs-22-debug +++ /dev/null @@ -1,8 +0,0 @@ -[settings] -os=Windows -arch=x86_64 -compiler=msvc -compiler.version=193 -compiler.runtime=dynamic -compiler.runtime_type=Debug -build_type=Debug \ No newline at end of file diff --git a/tools/conan-profiles/vs-22-debug-ninja b/tools/conan-profiles/vs-22-debug-ninja deleted file mode 100644 index 5bd5d0e0..00000000 --- a/tools/conan-profiles/vs-22-debug-ninja +++ /dev/null @@ -1,10 +0,0 @@ -[settings] -os=Windows -arch=x86_64 -compiler=msvc -compiler.version=193 -compiler.runtime=dynamic -compiler.runtime_type=Debug -build_type=Debug -[conf] -tools.cmake.cmaketoolchain:generator=Ninja \ No newline at end of file diff --git a/tools/conan-profiles/vs-22-release b/tools/conan-profiles/vs-22-release deleted file mode 100644 index 488df695..00000000 --- a/tools/conan-profiles/vs-22-release +++ /dev/null @@ -1,8 +0,0 @@ -[settings] -os=Windows -arch=x86_64 -compiler=msvc -compiler.version=193 -compiler.runtime=dynamic -compiler.runtime_type=Release -build_type=Release \ No newline at end of file diff --git a/tools/conan-profiles/vs-22-release-ninja b/tools/conan-profiles/vs-22-release-ninja deleted file mode 100644 index 0e917e11..00000000 --- a/tools/conan-profiles/vs-22-release-ninja +++ /dev/null @@ -1,10 +0,0 @@ -[settings] -os=Windows -arch=x86_64 -compiler=msvc -compiler.version=193 -compiler.runtime=dynamic -compiler.runtime_type=Release -build_type=Release -[conf] -tools.cmake.cmaketoolchain:generator=Ninja \ No newline at end of file diff --git a/tools/conan-profiles/vs-22-relwithdebinfo b/tools/conan-profiles/vs-22-relwithdebinfo deleted file mode 100644 index 4c63b3ff..00000000 --- a/tools/conan-profiles/vs-22-relwithdebinfo +++ /dev/null @@ -1,8 +0,0 @@ -[settings] -os=Windows -arch=x86_64 -compiler=msvc -compiler.version=193 -compiler.runtime=dynamic -compiler.runtime_type=RelWithDebInfo -build_type=RelWithDebInfo