1
0
Fork 0
forked from lthn/blockchain
blockchain/cmake/GetConan.cmake
2025-10-06 22:38:29 +01:00

102 lines
3.9 KiB
CMake

# cmake/GetConan.cmake
# This module downloads and installs Conan if it's not found.
# Set the Conan version
set(CONAN_VERSION 2.21.0)
# Set the download URLs
set(CONAN_URL_MACOS_ARM "https://github.com/conan-io/conan/releases/download/${CONAN_VERSION}/conan-${CONAN_VERSION}-macos-arm64.tgz")
set(CONAN_URL_MACOS_INTEL "https://github.com/conan-io/conan/releases/download/${CONAN_VERSION}/conan-${CONAN_VERSION}-macos-x86_64.tgz")
set(CONAN_URL_WINDOWS_X86_64 "https://github.com/conan-io/conan/releases/download/${CONAN_VERSION}/conan-${CONAN_VERSION}-windows-x86_64.zip")
set(CONAN_URL_WINDOWS_ARM64 "https://github.com/conan-io/conan/releases/download/${CONAN_VERSION}/conan-${CONAN_VERSION}-windows-arm64.zip")
set(CONAN_URL_LINUX_X86_64 "https://github.com/conan-io/conan/releases/download/${CONAN_VERSION}/conan-${CONAN_VERSION}-linux-x86_64.tgz")
set(CONAN_URL_LINUX_AARCH64 "https://github.com/conan-io/conan/releases/download/${CONAN_VERSION}/conan-${CONAN_VERSION}-linux-aarch64.tgz")
# Set the installation directory
if(NOT CMAKE_BINARY_DIR)
set(CMAKE_BINARY_DIR "${CONAN_INSTALL_DIR}")
endif()
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
set(CONAN_INSTALL_DIR "${CMAKE_SOURCE_DIR}/build/bin")
set(CONAN_EXECUTABLE "${CMAKE_SOURCE_DIR}/build/bin/conan.exe")
else ()
set(CONAN_INSTALL_DIR "${CMAKE_SOURCE_DIR}/build")
set(CONAN_EXECUTABLE "${CONAN_INSTALL_DIR}/bin/conan")
endif ()
# Check if Conan is already installed
if(NOT EXISTS "${CONAN_EXECUTABLE}")
message(STATUS "Conan not found. Downloading and installing...")
file(MAKE_DIRECTORY "${CONAN_INSTALL_DIR}")
# Determine the processor architecture, with a fallback
if(CMAKE_HOST_SYSTEM_PROCESSOR)
set(HOST_PROCESSOR ${CMAKE_HOST_SYSTEM_PROCESSOR})
else()
cmake_host_system_information(RESULT HOST_PROCESSOR QUERY OS_PLATFORM)
endif()
# Detect the operating system and architecture
message(STATUS "Detecting OS and architecture: ${HOST_PROCESSOR} on ${CMAKE_HOST_SYSTEM_NAME}")
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
if(HOST_PROCESSOR MATCHES "arm64")
set(CONAN_URL ${CONAN_URL_MACOS_ARM})
set(CONAN_ARCHIVE_TYPE "tgz")
else()
set(CONAN_URL ${CONAN_URL_MACOS_INTEL})
set(CONAN_ARCHIVE_TYPE "tgz")
endif()
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
if(HOST_PROCESSOR MATCHES "ARM64")
set(CONAN_URL ${CONAN_URL_WINDOWS_ARM64})
set(CONAN_ARCHIVE_TYPE "zip")
else()
set(CONAN_URL ${CONAN_URL_WINDOWS_X86_64})
set(CONAN_ARCHIVE_TYPE "zip")
endif()
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
if(HOST_PROCESSOR MATCHES "aarch64|arm64|ARM64")
set(CONAN_URL ${CONAN_URL_LINUX_AARCH64})
set(CONAN_ARCHIVE_TYPE "tgz")
else()
set(CONAN_URL ${CONAN_URL_LINUX_X86_64})
set(CONAN_ARCHIVE_TYPE "tgz")
endif()
else()
message(FATAL_ERROR "Unsupported operating system: ${CMAKE_HOST_SYSTEM_NAME}")
endif()
# Download and extract Conan
set(CONAN_ARCHIVE "${CMAKE_BINARY_DIR}/conan.${CONAN_ARCHIVE_TYPE}")
message(STATUS "Downloading ${CONAN_URL} to ${CONAN_ARCHIVE}")
file(DOWNLOAD "${CONAN_URL}" "${CONAN_ARCHIVE}" SHOW_PROGRESS)
message(STATUS "Extracting ${CONAN_ARCHIVE} to ${CONAN_INSTALL_DIR}")
if(CONAN_ARCHIVE_TYPE STREQUAL "tgz")
execute_process(
COMMAND ${CMAKE_COMMAND} -E tar xzf "${CONAN_ARCHIVE}"
WORKING_DIRECTORY "${CONAN_INSTALL_DIR}"
RESULT_VARIABLE result
)
elseif(CONAN_ARCHIVE_TYPE STREQUAL "zip")
# CMake -E tar can handle zip files
execute_process(
COMMAND ${CMAKE_COMMAND} -E tar xf "${CONAN_ARCHIVE}"
WORKING_DIRECTORY "${CONAN_INSTALL_DIR}"
RESULT_VARIABLE result
)
endif()
if(NOT result EQUAL 0)
message(FATAL_ERROR "Failed to extract Conan archive.")
endif()
# Clean up the archive
file(REMOVE "${CONAN_ARCHIVE}")
message(STATUS "Conan installed successfully at ${CONAN_EXECUTABLE}")
else()
message(STATUS "Conan already installed at ${CONAN_EXECUTABLE}")
endif()