diff --git a/cmake/generators/ninja.cmake b/cmake/generators/ninja.cmake index b2d321f..bd895fe 100644 --- a/cmake/generators/ninja.cmake +++ b/cmake/generators/ninja.cmake @@ -74,7 +74,7 @@ if(IS_EXECUTABLE "${NINJA_BIN}") message(STATUS "Found outdated v${NINJA_VERSION_INSTALLED}.") unset(NINJA_BIN) else() - message(STATUS "Found v${NINJA_VERSION_INSTALLED}.") + #message(STATUS "Found v${NINJA_VERSION_INSTALLED}.") endif() endif() @@ -109,12 +109,16 @@ if((NOT IS_EXECUTABLE "${NINJA_BIN}") OR (NINJA_VERSION_INSTALLED VERSION_LESS N endif() # Download the ideal version. - message(STATUS "Downloading Ninja v${NINJA_VERSION}...") - file(DOWNLOAD - "https://github.com/ninja-build/ninja/releases/download/v${NINJA_VERSION}/${_FILE_NAME}.${_FILE_EXT}" - "${NINJA_DIR}.${_FILE_EXT}" - SHOW_PROGRESS - ) + if(NOT EXISTS "${NINJA_DIR}.${_FILE_EXT}") + message(STATUS "Downloading Ninja v${NINJA_VERSION}...") + file(DOWNLOAD + "https://github.com/ninja-build/ninja/releases/download/v${NINJA_VERSION}/${_FILE_NAME}.${_FILE_EXT}" + "${NINJA_DIR}.${_FILE_EXT}" + SHOW_PROGRESS + ) + else() + message(STATUS "Skipping download as file already exists.") + endif() # Extract it. message(STATUS "Extracting...") @@ -147,11 +151,10 @@ if((NOT IS_EXECUTABLE "${NINJA_BIN}") OR (NINJA_VERSION_INSTALLED VERSION_LESS N endif() if((NOT IS_EXECUTABLE "${NINJA_BIN}") OR (NINJA_VERSION_INSTALLED VERSION_LESS NINJA_VERSION)) - message(STATUS "NINJA_DIR=${NINJA_DIR}") - message(STATUS "NINJA_BIN=${NINJA_BIN}") - message(STATUS "NINJA_VERSION=${NINJA_VERSION}") - message(STATUS "NINJA_VERSION_INSTALLED=${NINJA_VERSION_INSTALLED}") message(FATAL_ERROR "Failed to install newer version of Ninja.") +elseif(IS_EXECUTABLE "${NINJA_BIN}") + message(STATUS "Found v${NINJA_VERSION_INSTALLED}.") endif() -set(CMAKE_MAKE_PROGRAM "${NINJA_BIN}" CACHE STRING "" FORCE) \ No newline at end of file +set(CMAKE_MAKE_PROGRAM "${NINJA_BIN}" CACHE STRING "" FORCE) +list(POP_BACK CMAKE_MESSAGE_INDENT) \ No newline at end of file diff --git a/cmake/toolchains/llvm-arm.cmake b/cmake/toolchains/llvm-arm.cmake deleted file mode 100644 index 23ee8e8..0000000 --- a/cmake/toolchains/llvm-arm.cmake +++ /dev/null @@ -1,220 +0,0 @@ -# Copyright (C) 2023-2024 Michael Fabian 'Xaymar' Dirks -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -cmake_minimum_required(VERSION 3.30...4.0) -include_guard(GLOBAL) - -if((CMAKE_GENERATOR STREQUAL "Ninja") OR (CMAKE_GENERATOR STREQUAL "Ninja Multi-Config")) - include("${CMAKE_CURRENT_LIST_DIR}/../generators/ninja.cmake") -endif() - -list(APPEND CMAKE_MESSAGE_INDENT "[LLVM-ARM] ") -set(_VERSION "18.1.3") -set(_FILE "llvm-arm-${CMAKE_HOST_SYSTEM_NAME}-${CMAKE_HOST_SYSTEM_PROCESSOR}") -if(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows") # Windows - set(_FILENAME "LLVM-ET-Arm-${_VERSION}-Windows-x86_64") - set(_FILEEXT "zip") -elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin") # Darwin - set(_FILENAME "LLVM-ET-Arm-${_VERSION}-Darwin") - set(_FILEEXT "dmg") -else() # Generic Unix-like - set(_FILEEXT "tar.xz") - if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)") - set(_FILENAME "LLVM-ET-Arm-${_VERSION}-Linux-x86_64") - else() - set(_FILENAME "LLVM-ET-Arm-${_VERSION}-Linux-AArch64") - endif() -endif() - -# Very hacky way to get CMake to behave like a normal makefile generator, instead of a mentally challenged makefile generator. -if(TRUE) # Check if we've already installed one of these, - if(WIN32) - set(TEMP "$ENV{TEMP}") - else() - set(TEMP "$ENV{TMPDIR}") - endif() - set(_PATH "${TEMP}/cmake/llvm-arm/${_VERSION}") - if(EXISTS "${_PATH}") - file(READ "${_PATH}" _DIR) - if (NOT EXISTS "${_DIR}") - file(REMOVE "${_PATH}") - unset(_DIR) - endif() - endif() -endif() - -if((NOT _DIR) OR (EXISTS "${PROJECT_BINARY_DIR}/toolchain/${_FILE}.version")) - # Check if the version is what we expect. - if(EXISTS "${PROJECT_BINARY_DIR}/toolchain/${_FILE}.version") - file(READ "${PROJECT_BINARY_DIR}/toolchain/${_FILE}.version" _VERSION_STORED) - endif() - if((NOT _VERSION_STORED) OR (_VERSION_STORED VERSION_LESS _VERSION)) - message(STATUS "Updating... (${_VERSION_STORED} < ${_VERSION})") - - - # Download the appropriate package from https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm - #- Grab the latest hash from the remote. - set(_HASH_FILE "${PROJECT_BINARY_DIR}/toolchain/${_FILE}.sha256") - file(DOWNLOAD - "https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/download/release-${_VERSION}/${_FILENAME}.${_FILEEXT}.sha256" - "${_HASH_FILE}" - ) - file(READ "${_HASH_FILE}" _DOWNLOAD_SHA256) - string(REGEX MATCH "[0-9a-fA-F]+" _DOWNLOAD_SHA256 "${_DOWNLOAD_SHA256}") - file(REMOVE "${_HASH_FILE}") - - #- Download the latest toolchain - set(_PACKAGE_FILE "${PROJECT_BINARY_DIR}/toolchain/${_FILE}.${_FILEEXT}") - file(DOWNLOAD - "https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/download/release-${_VERSION}/${_FILENAME}.${_FILEEXT}" - "${_PACKAGE_FILE}" - EXPECTED_HASH SHA256=${_DOWNLOAD_SHA256} - ) - - #- Extract the contents - file(ARCHIVE_EXTRACT - INPUT "${_PACKAGE_FILE}" - DESTINATION "${PROJECT_BINARY_DIR}/toolchain/" - ) - #file(REMOVE "${_PACKAGE_FILE}") - - file(WRITE "${PROJECT_BINARY_DIR}/toolchain/${_FILE}.version" "${_VERSION}") - endif() - - # Update the virtual link - file(WRITE "${_PATH}" "${PROJECT_BINARY_DIR}/toolchain/${_FILENAME}/") - - set(_LLVM_TOOLCHAIN "${PROJECT_BINARY_DIR}/toolchain/${_FILENAME}/") -else() - set(_LLVM_TOOLCHAIN "${_DIR}") -endif() - -list(APPEND CMAKE_PREFIX_PATH - "${_LLVM_TOOLCHAIN}/bin" - "${_LLVM_TOOLCHAIN}" -) -# Find necessary programs. -# - AR -find_program( - CMAKE_AR - NAMES - llvm-ar - PATHS - "${_LLVM_TOOLCHAIN}/bin" - NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH -) -# - Library Randomizer -find_program( - CMAKE_RANLIB - NAMES - llvm-ranlib - PATHS - "${_LLVM_TOOLCHAIN}/bin" - NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH -) -# - Linker -find_program( - CMAKE_LINKER - NAMES - ld.lld - PATHS - "${_LLVM_TOOLCHAIN}/bin" - NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH -) -# - Object Copy -find_program( - CMAKE_OBJCOPY - NAMES - llvm-objcopy - PATHS - "${_LLVM_TOOLCHAIN}/bin" - NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH -) -# - Object Dump -find_program( - CMAKE_OBJDUMP - NAMES - llvm-objdump - PATHS - "${_LLVM_TOOLCHAIN}/bin" - NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH -) -# - Strip Debug Info -find_program( - CMAKE_STRIP - NAMES - llvm-strip - PATHS - "${_LLVM_TOOLCHAIN}/bin" - NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH -) -# - C Compiler -find_program( - CMAKE_C_COMPILER - NAMES - clang - clang++ - clang-cpp - PATHS - "${_LLVM_TOOLCHAIN}/bin" - NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH -) -set(CMAKE_C_COMPILER_AR "${CMAKE_AR}" CACHE STRING "" FORCE) -#set(CMAKE_C_COMPILER_CLANG_SCAN_DEPS "NOT-FOUND" CACHE STRING "" FORCE) -set(CMAKE_C_COMPILER_RANLIB "${CMAKE_RANLIB}" CACHE STRING "" FORCE) -set(CMAKE_C_LINKER "${CMAKE_LINKER}" CACHE STRING "" FORCE) -set(CMAKE_C_LINKER_ID "LDD" CACHE STRING "" FORCE) -set(CMAKE_C_LINKER_FRONTEND_VARIANT "LLD" CACHE STRING "" FORCE) -# - C++ Compiler -find_program( - CMAKE_CXX_COMPILER - NAMES - clang++ - clang-cpp - clang - PATHS - "${_LLVM_TOOLCHAIN}/bin" - NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH -) -set(CMAKE_CXX_COMPILER_AR "${CMAKE_AR}" CACHE STRING "" FORCE) -#set(CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS "NOT-FOUND" CACHE STRING "" FORCE) -set(CMAKE_CXX_SCAN_FOR_MODULES OFF CACHE BOOL "" FORCE) -set(CMAKE_CXX_COMPILER_RANLIB "${CMAKE_RANLIB}" CACHE STRING "" FORCE) -set(CMAKE_CXX_LINKER "${CMAKE_C_LINKER}" CACHE STRING "" FORCE) -set(CMAKE_CXX_LINKER_ID "LLD" CACHE STRING "" FORCE) -set(CMAKE_CXX_LINKER_FRONTEND_VARIANT "LLD" CACHE STRING "" FORCE) -# - Assembly Compiler -set(CMAKE_ASM_COMPILER "${CMAKE_C_COMPILER}" CACHE STRING "" FORCE) -set(CMAKE_ASM_COMPILER_AR "${CMAKE_AR}" CACHE STRING "" FORCE) -#set(CMAKE_ASM_COMPILER_CLANG_SCAN_DEPS "NOT-FOUND" CACHE STRING "" FORCE) -set(CMAKE_ASM_COMPILER_RANLIB "${CMAKE_RANLIB}" CACHE STRING "" FORCE) -set(CMAKE_ASM_LINKER "${CMAKE_C_LINKER}" CACHE STRING "" FORCE) -set(CMAKE_ASM_LINKER_ID "LLD" CACHE STRING "" FORCE) -set(CMAKE_ASM_LINKER_FRONTEND_VARIANT "LLD" CACHE STRING "" FORCE) - -#mark_as_advanced(CLANG_C_COMPILER CLANG_CPP_COMPILER CLANG__AR CLANG__LD_LDD) -set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=\"${CMAKE_C_LINKER}\"") -set(CMAKE_STATIC_LINKER_FLAGS_INIT "-fuse-ld=\"${CMAKE_C_LINKER}\"") -set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=\"${CMAKE_C_LINKER}\"") -set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=\"${CMAKE_C_LINKER}\"") - -execute_process( - COMMAND "${CMAKE_C_COMPILER}" "--version" - OUTPUT_VARIABLE _VERSION_INSTALLED - OUTPUT_STRIP_TRAILING_WHITESPACE -) -string(REGEX MATCH "[0-9]+\.[0-9]+\.[0-9]+" _VERSION_INSTALLED "${_VERSION_INSTALLED}") -message(STATUS "v${_VERSION_INSTALLED}") -list(POP_BACK CMAKE_MESSAGE_INDENT) diff --git a/cmake/toolchains/llvm.cmake b/cmake/toolchains/llvm.cmake index 7a79b23..4aa8c44 100644 --- a/cmake/toolchains/llvm.cmake +++ b/cmake/toolchains/llvm.cmake @@ -13,7 +13,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# This is a self-contained toolchain file that sets up everything necessary to compile with LLVM/Clang. +# This is a (mostly) self-contained toolchain file that sets up everything necessary to compile with LLVM/Clang. +# cmake --fresh -C cmake/generators/ninja.cmake --preset windows-x64-llvm cmake_minimum_required(VERSION 3.30...4.0) include_guard(GLOBAL) @@ -36,6 +37,22 @@ if(CMAKE_HOST_SYSTEM_NAME MATCHES "[Ww]indows") set(_FILE_NAME "LLVM-${LLVM_VERSION}-woa64") endif() set(_FILE_EXT "exe") + + #Computer\HKEY_CURRENT_USER\SOFTWARE\7-Zip\Path64 + cmake_host_system_information( + RESULT 7ZIP_DIR + QUERY WINDOWS_REGISTRY "HKCU/SOFTWARE/7-Zip" VALUE "Path64" + VIEW HOST + ) + find_program(7ZIP_BIN + NAMES + 7z + 7za + HINTS + "${7ZIP_DIR}" + "C:/Program Files/7-Zip" + "C:/Program Files (x86)/7-Zip" + ) elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "[Dd]arwin") set(_OS "macos") execute_process( @@ -88,116 +105,99 @@ else() endif() set(LLVM_DIR "${CMAKE_SOURCE_DIR}/extra/llvm-${LLVM_VERSION}-${_OS}-${_ARCH}") -foreach(_T IN ITEMS LLVM_VERSION LLVM_VERSION_INSTALLED LLVM_DIR LLVM_AR LLVM_LD LLVM_RANLIB LLVM_OBJCOPY LLVM_OBJDUMP LLVM_STRIP LLVM_CLANG LLVM_CLANGPP) - message(STATUS "${_T}=${${_T}}") -endforeach() - -function(validator_llvm_bin _var _item) - message(STATUS "${_var} ${_item}") - if(NOT IS_EXECUTABLE "${_item}") - set("${_var}" FALSE PARENT_SCOPE) - return() - endif() - execute_process( - COMMAND "${_item}" --version - OUTPUT_VARIABLE _OUT - RESULT_VARIABLE _RES - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - message(STATUS "${_OUT} ${_RES}") - if(NOT _RES EQUAL 0) - set("${_var}" FALSE PARENT_SCOPE) - return() - endif() - if(_OUT VERSION_LESS LLVM_VERSION) - set("${_var}" FALSE PARENT_SCOPE) - return() - endif() - set("${_var}" TRUE PARENT_SCOPE) - set(LLVM_VERSION_INSTALLED "${_OUT}" PARENT_SCOPE) -endfunction() - macro(find_llvm) - set(LLVM_FOUND "NOT-FOUND") + set(LLVM_FOUND "FALSE") + # - AR find_program( LLVM_AR NAMES llvm-ar - HINTS - "${LLVM_DIR}/bin" - #VALIDATOR validator_llvm_bin - NO_CACHE NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH + PATHS + "${LLVM_DIR}/bin/" + NO_CACHE ) + # - Library Randomizer find_program( LLVM_RANLIB NAMES llvm-ranlib - HINTS - "${LLVM_DIR}/bin" - #VALIDATOR validator_llvm_bin - NO_CACHE NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH + PATHS + "${LLVM_DIR}/bin/" + NO_CACHE ) + # - Linker - find_program( - LLVM_LD - NAMES - ld.lld - HINTS - "${LLVM_DIR}/bin" - #VALIDATOR validator_llvm_bin - NO_CACHE NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH - ) + if(_ARCH MATCHES "[xX]64") + find_program( + LLVM_LD + NAMES + ld64.lld + ld.lld + PATHS + "${LLVM_DIR}/bin/" + NO_CACHE + ) + else() + find_program( + LLVM_LD + NAMES + ld.lld + PATHS + "${LLVM_DIR}/bin/" + NO_CACHE + ) + endif() + # - Object Copy find_program( LLVM_OBJCOPY NAMES llvm-objcopy - HINTS - "${LLVM_DIR}/bin" - #VALIDATOR validator_llvm_bin - NO_CACHE NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH + PATHS + "${LLVM_DIR}/bin/" + NO_CACHE ) + # - Object Dump find_program( LLVM_OBJDUMP NAMES llvm-objdump - HINTS - "${LLVM_DIR}/bin" - #VALIDATOR validator_llvm_bin - NO_CACHE NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH + PATHS + "${LLVM_DIR}/bin/" + NO_CACHE ) + # - Strip Debug Info find_program( LLVM_STRIP NAMES llvm-strip - HINTS - "${LLVM_DIR}/bin" - #VALIDATOR validator_llvm_bin - NO_CACHE NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH + PATHS + "${LLVM_DIR}/bin/" + NO_CACHE ) + # - C Compiler find_program( LLVM_CLANG NAMES clang - HINTS - "${LLVM_DIR}/bin" - #VALIDATOR validator_llvm_bin - NO_CACHE NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH + PATHS + "${LLVM_DIR}/bin/" + NO_CACHE ) + # - C++ Compiler find_program( LLVM_CLANGPP NAMES clang++ - HINTS - "${LLVM_DIR}/bin" - #VALIDATOR validator_llvm_bin - NO_CACHE NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH + PATHS + "${LLVM_DIR}/bin/" + NO_CACHE ) set(LLVM_FOUND TRUE) @@ -210,91 +210,126 @@ macro(find_llvm) "LLVM_STRIP" "LLVM_CLANG" "LLVM_CLANGPP") - message(STATUS "${_TEST}=${${_TEST}}") if(NOT IS_EXECUTABLE ${${_TEST}}) set(LLVM_FOUND FALSE) - foreach(_TEST IN ITEMS - "LLVM_AR" - "LLVM_LD" - "LLVM_RANLIB" - "LLVM_OBJCOPY" - "LLVM_OBJDUMP" - "LLVM_STRIP" - "LLVM_CLANG" - "LLVM_CLANGPP") - unset(${_TEST}) - endforeach() + break() + else() + execute_process( + COMMAND "${${_TEST}}" --version + OUTPUT_VARIABLE ${_TEST}_VERSION + RESULT_VARIABLE _RES + ) + if(NOT _RES EQUAL 0) + set(LLVM_FOUND FALSE) + break() + endif() + + string(REGEX MATCH "[1-9+]?[0-9+]\.[1-9+]?[0-9+]\.[1-9+]?[0-9+]\." "${_TEST}_VERSION" "${${_TEST}_VERSION}") + string(REGEX REPLACE "[\r\n]+" "" "${_TEST}_VERSION" "${${_TEST}_VERSION}") + if(${_TEST}_VERSION VERSION_LESS LLVM_VERSION) + set(LLVM_FOUND FALSE) + endif() endif() endforeach() + +# foreach(_T IN ITEMS LLVM_VERSION LLVM_DIR LLVM_AR LLVM_LD LLVM_RANLIB LLVM_OBJCOPY LLVM_OBJDUMP LLVM_STRIP LLVM_CLANG LLVM_CLANGPP LLVM_AR_VERSION LLVM_LD_VERSION LLVM_RANLIB_VERSION LLVM_OBJCOPY_VERSION LLVM_OBJDUMP_VERSION LLVM_STRIP_VERSION LLVM_CLANG_VERSION LLVM_CLANGPP) +# message(STATUS "${_T}=${${_T}}") +# endforeach() endmacro() # Try and find an existing LLVM installation. find_llvm() -foreach(_T IN ITEMS LLVM_VERSION LLVM_VERSION_INSTALLED LLVM_DIR LLVM_AR LLVM_LD LLVM_RANLIB LLVM_OBJCOPY LLVM_OBJDUMP LLVM_STRIP LLVM_CLANG LLVM_CLANGPP) - message(STATUS "${_T}=${${_T}}") -endforeach() -if(LLVM_FOUND) - message(STATUS "Found v${LLVM_VERSION_INSTALLED}.") -elseif(LLVM_VERSION_INSTALLED AND LLVM_VERSION_INSTALLED VERSION_LESS LLVM_VERSION) - message(STATUS "Found outdated v${LLVM_VERSION_INSTALLED}.") -elseif(NOT LLVM_FOUND AND NOT LLVM_VERSION_INSTALLED) +if(LLVM_CLANG_VERSION AND LLVM_CLANG_VERSION VERSION_LESS LLVM_VERSION) + message(STATUS "Found outdated v${LLVM_CLANG_VERSION}.") +elseif(NOT LLVM_FOUND) message(STATUS "No installed LLVM found.") endif() -if(NOT LLVM_FOUND) +if(NOT LLVM_FOUND OR (LLVM_CLANG_VERSION VERSION_LESS LLVM_VERSION)) # It isn't up to date or doesn't exist, so try to download the latest version. + if((_FILE_EXT MATCHES "exe") AND NOT 7ZIP_BIN) + message(FATAL_ERROR "7-Zip is required to continue setting up LLVM. Please provide '7z.exe' in PATH or by installing the latest version from https://www.7-zip.org/.") + endif() # Download the ideal version. - message(STATUS "Downloading LLVM v${LLVM_VERSION}...") - file(DOWNLOAD - "https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/${_FILE_NAME}.${_FILE_EXT}" - "${LLVM_DIR}.${_FILE_EXT}" - SHOW_PROGRESS - ) + if(NOT EXISTS "${LLVM_DIR}.${_FILE_EXT}") + message(STATUS "Downloading LLVM v${LLVM_VERSION}...") + file(DOWNLOAD + "https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/${_FILE_NAME}.${_FILE_EXT}" + "${LLVM_DIR}.${_FILE_EXT}" + SHOW_PROGRESS + ) + else() + message(STATUS "Skipping download as file already exists.") + endif() # Extract it. message(STATUS "Extracting...") - file(ARCHIVE_EXTRACT - INPUT "${LLVM_DIR}.${_FILE_EXT}" - DESTINATION "${LLVM_DIR}/" - ) + if(_FILE_EXT MATCHES "exe") + execute_process( + COMMAND ${7ZIP_BIN} x -y -aoa "-o${LLVM_DIR}/" "${LLVM_DIR}.${_FILE_EXT}" + COMMAND_ERROR_IS_FATAL ANY + OUTPUT_QUIET + ERROR_QUIET + ) + else() + file(ARCHIVE_EXTRACT + INPUT "${LLVM_DIR}.${_FILE_EXT}" + DESTINATION "${LLVM_DIR}/" + ) + endif() + # Delete the archive itself. + message(STATUS "Cleaning...") + file(REMOVE "${LLVM_DIR}.${_FILE_EXT}") + + # Final stuff + #message(STATUS "Testing...") + find_llvm() endif() +if(LLVM_FOUND AND (LLVM_CLANG_VERSION VERSION_GREATER_EQUAL LLVM_VERSION)) + message(STATUS "Found v${LLVM_CLANG_VERSION}.") + + set(CMAKE_AR "${LLVM_AR}" CACHE STRING "" FORCE) + set(CMAKE_RANLIB "${LLVM_RANLIB}" CACHE STRING "" FORCE) + set(CMAKE_LINKER "${LLVM_LD}" CACHE STRING "" FORCE) + set(CMAKE_C_COMPILER "${LLVM_CLANG}" CACHE STRING "" FORCE) + set(CMAKE_C_COMPILER_AR "${LLVM_AR}" CACHE STRING "" FORCE) + set(CMAKE_C_COMPILER_RANLIB "${LLVM_RANLIB}" CACHE STRING "" FORCE) + set(CMAKE_C_COMPILER_LINKER "${LLVM_LD}" CACHE STRING "" FORCE) + set(CMAKE_C_COMPILER_LINKER_ID "LLD" CACHE STRING "" FORCE) + set(CMAKE_C_COMPILER_LINKER_VERSION "${LLVM_LD_VERSION}" CACHE STRING "" FORCE) -# set(CMAKE_C_COMPILER_AR "${CMAKE_AR}" CACHE STRING "" FORCE) -# #set(CMAKE_C_COMPILER_CLANG_SCAN_DEPS "NOT-FOUND" CACHE STRING "" FORCE) -# set(CMAKE_C_COMPILER_RANLIB "${CMAKE_RANLIB}" CACHE STRING "" FORCE) -# set(CMAKE_C_LINKER "${CMAKE_LINKER}" CACHE STRING "" FORCE) -# set(CMAKE_C_LINKER_ID "LDD" CACHE STRING "" FORCE) -# set(CMAKE_C_LINKER_FRONTEND_VARIANT "LLD" CACHE STRING "" FORCE) -# set(CMAKE_CXX_COMPILER_AR "${CMAKE_AR}" CACHE STRING "" FORCE) -# #set(CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS "NOT-FOUND" CACHE STRING "" FORCE) -# set(CMAKE_CXX_SCAN_FOR_MODULES OFF CACHE BOOL "" FORCE) -# set(CMAKE_CXX_COMPILER_RANLIB "${CMAKE_RANLIB}" CACHE STRING "" FORCE) -# set(CMAKE_CXX_LINKER "${CMAKE_C_LINKER}" CACHE STRING "" FORCE) -# set(CMAKE_CXX_LINKER_ID "LLD" CACHE STRING "" FORCE) -# set(CMAKE_CXX_LINKER_FRONTEND_VARIANT "LLD" CACHE STRING "" FORCE) -# # - Assembly Compiler -# set(CMAKE_ASM_COMPILER "${CMAKE_C_COMPILER}" CACHE STRING "" FORCE) -# set(CMAKE_ASM_COMPILER_AR "${CMAKE_AR}" CACHE STRING "" FORCE) -# #set(CMAKE_ASM_COMPILER_CLANG_SCAN_DEPS "NOT-FOUND" CACHE STRING "" FORCE) -# set(CMAKE_ASM_COMPILER_RANLIB "${CMAKE_RANLIB}" CACHE STRING "" FORCE) -# set(CMAKE_ASM_LINKER "${CMAKE_C_LINKER}" CACHE STRING "" FORCE) -# set(CMAKE_ASM_LINKER_ID "LLD" CACHE STRING "" FORCE) -# set(CMAKE_ASM_LINKER_FRONTEND_VARIANT "LLD" CACHE STRING "" FORCE) -# #mark_as_advanced(CLANG_C_COMPILER CLANG_CPP_COMPILER CLANG__AR CLANG__LD_LDD) -# set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=\"${CMAKE_C_LINKER}\"") -# set(CMAKE_STATIC_LINKER_FLAGS_INIT "-fuse-ld=\"${CMAKE_C_LINKER}\"") -# set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=\"${CMAKE_C_LINKER}\"") -# set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=\"${CMAKE_C_LINKER}\"") + set(CMAKE_CXX_COMPILER "${LLVM_CLANGPP}" CACHE STRING "" FORCE) + set(CMAKE_CXX_COMPILER_AR "${LLVM_AR}" CACHE STRING "" FORCE) + set(CMAKE_CXX_COMPILER_RANLIB "${LLVM_RANLIB}" CACHE STRING "" FORCE) + set(CMAKE_CXX_COMPILER_LINKER "${LLVM_LD}" CACHE STRING "" FORCE) + set(CMAKE_CXX_COMPILER_LINKER_ID "LLD" CACHE STRING "" FORCE) + set(CMAKE_CXX_COMPILER_LINKER_VERSION "${LLVM_LD_VERSION}" CACHE STRING "" FORCE) -# execute_process( -# COMMAND "${CMAKE_C_COMPILER}" "--version" -# OUTPUT_VARIABLE _VERSION_INSTALLED -# OUTPUT_STRIP_TRAILING_WHITESPACE -# ) -# string(REGEX MATCH "[0-9]+\.[0-9]+\.[0-9]+" _VERSION_INSTALLED "${LLVM_VERSION_INSTALLED}") -# message(STATUS "v${LLVM_VERSION_INSTALLED}") -# list(POP_BACK CMAKE_MESSAGE_INDENT) + set(CMAKE_ASM_COMPILER "${LLVM_CLANG}" CACHE STRING "" FORCE) + set(CMAKE_ASM_COMPILER_AR "${LLVM_AR}" CACHE STRING "" FORCE) + set(CMAKE_ASM_COMPILER_RANLIB "${LLVM_RANLIB}" CACHE STRING "" FORCE) + set(CMAKE_ASM_COMPILER_LINKER "${LLVM_LD}" CACHE STRING "" FORCE) + set(CMAKE_ASM_COMPILER_LINKER_ID "LLD" CACHE STRING "" FORCE) + set(CMAKE_ASM_COMPILER_LINKER_VERSION "${LLVM_LD_VERSION}" CACHE STRING "" FORCE) + + set(CMAKE_RC_COMPILER "${LLVM_CLANG}" CACHE STRING "" FORCE) + set(CMAKE_RC_COMPILER_AR "${LLVM_AR}" CACHE STRING "" FORCE) + set(CMAKE_RC_COMPILER_RANLIB "${LLVM_RANLIB}" CACHE STRING "" FORCE) + set(CMAKE_RC_COMPILER_LINKER "${LLVM_LD}" CACHE STRING "" FORCE) + set(CMAKE_RC_COMPILER_LINKER_ID "LLD" CACHE STRING "" FORCE) + set(CMAKE_RC_COMPILER_LINKER_VERSION "${LLVM_LD_VERSION}" CACHE STRING "" FORCE) + + # Needed otherwise CMake will attempt to use GNU ld, MSVC link.exe, or AppleClangs lld +# set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=\"${LLVM_LD}\"") +# set(CMAKE_STATIC_LINKER_FLAGS_INIT "-fuse-ld=\"${LLVM_LD}\"") +# set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=\"${LLVM_LD}\"") +# set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=\"${LLVM_LD}\"") +else() + message(FATAL_ERROR "Failed to find or provide a compatible LLVM installation.") +endif() + +list(POP_BACK CMAKE_MESSAGE_INDENT) \ No newline at end of file