forked from lthn/blockchain
102 lines
3.9 KiB
CMake
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()
|