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