Fix try_compile failure
For unknown reasons, CMake does not propagate the compiler settings to the try_compile process but instead forwards the toolchain directly. This is weird.
This commit is contained in:
@@ -20,21 +20,29 @@ cmake_minimum_required(VERSION 3.30...4.0)
|
||||
include_guard(GLOBAL)
|
||||
list(APPEND CMAKE_MESSAGE_INDENT "[Ninja] ")
|
||||
|
||||
# Try and figure out what processor we need to get binaries for.
|
||||
if(CMAKE_HOST_SYSTEM_NAME MATCHES "[Ww]indows")
|
||||
# Necessary for propagation into the try_compile CMake subprocesses. It's unclear why this is not the default behavior.
|
||||
foreach(_T IN ITEMS CMAKE_MAKE_PROGRAM)
|
||||
if(DEFINED ENV{${_T}})
|
||||
set(${_T} "$ENV{${_T}}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
if(NOT IS_EXECUTABLE CMAKE_MAKE_PROGRAM)
|
||||
# Try and figure out what processor we need to get binaries for.
|
||||
if(CMAKE_HOST_SYSTEM_NAME MATCHES "[Ww]indows")
|
||||
string(TOLOWER "$ENV{PROCESSOR_ARCHITECTURE}" _ARCH)
|
||||
set(_OS "windows")
|
||||
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "[Dd]arwin")
|
||||
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "[Dd]arwin")
|
||||
set(_ARCH "multiarch")
|
||||
set(_OS "macos")
|
||||
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "[Oo]pen[Bb][Ss][Dd]")
|
||||
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "[Oo]pen[Bb][Ss][Dd]")
|
||||
set(_OS "openbsd")
|
||||
execute_process(
|
||||
COMMAND "arch"
|
||||
OUTPUT_VARIABLE _ARCH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
else()
|
||||
else()
|
||||
set(_OS "linux")
|
||||
execute_process(
|
||||
COMMAND "uname -p"
|
||||
@@ -50,20 +58,20 @@ else()
|
||||
RESULT_VARIABLE _RES
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(NINJA_VERSION "1.12.1")
|
||||
set(NINJA_DIR "${CMAKE_SOURCE_DIR}/extra/ninja-${NINJA_VERSION}-${_OS}-${_ARCH}")
|
||||
set(NINJA_VERSION "1.12.1")
|
||||
set(NINJA_DIR "${CMAKE_SOURCE_DIR}/extra/ninja-${NINJA_VERSION}-${_OS}-${_ARCH}")
|
||||
|
||||
# Check if Ninja is present and if it is up to date.
|
||||
find_program(NINJA_BIN
|
||||
# Check if Ninja is present and if it is up to date.
|
||||
find_program(NINJA_BIN
|
||||
NAMES
|
||||
ninja
|
||||
HINTS
|
||||
"${NINJA_DIR}/"
|
||||
NO_CACHE NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH
|
||||
)
|
||||
if(IS_EXECUTABLE "${NINJA_BIN}")
|
||||
)
|
||||
if(IS_EXECUTABLE "${NINJA_BIN}")
|
||||
execute_process(
|
||||
COMMAND ${NINJA_BIN} --version
|
||||
OUTPUT_VARIABLE NINJA_VERSION_INSTALLED
|
||||
@@ -76,9 +84,9 @@ if(IS_EXECUTABLE "${NINJA_BIN}")
|
||||
else()
|
||||
#message(STATUS "Found v${NINJA_VERSION_INSTALLED}.")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if((NOT IS_EXECUTABLE "${NINJA_BIN}") OR (NINJA_VERSION_INSTALLED VERSION_LESS NINJA_VERSION))
|
||||
if((NOT IS_EXECUTABLE "${NINJA_BIN}") OR (NINJA_VERSION_INSTALLED VERSION_LESS NINJA_VERSION))
|
||||
# It isn't up to date or doesn't exist, so try to download the latest version.
|
||||
|
||||
# First we'll have to figure out what we need to download, and from where.
|
||||
@@ -148,13 +156,15 @@ if((NOT IS_EXECUTABLE "${NINJA_BIN}") OR (NINJA_VERSION_INSTALLED VERSION_LESS N
|
||||
)
|
||||
string(REGEX REPLACE "[\r\n]+" "" NINJA_VERSION_INSTALLED "${NINJA_VERSION_INSTALLED}")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if((NOT IS_EXECUTABLE "${NINJA_BIN}") OR (NINJA_VERSION_INSTALLED VERSION_LESS NINJA_VERSION))
|
||||
if((NOT IS_EXECUTABLE "${NINJA_BIN}") OR (NINJA_VERSION_INSTALLED VERSION_LESS NINJA_VERSION))
|
||||
message(FATAL_ERROR "Failed to install newer version of Ninja.")
|
||||
elseif(IS_EXECUTABLE "${NINJA_BIN}")
|
||||
elseif(IS_EXECUTABLE "${NINJA_BIN}")
|
||||
message(STATUS "Found v${NINJA_VERSION_INSTALLED}.")
|
||||
endif()
|
||||
|
||||
set(CMAKE_MAKE_PROGRAM "${NINJA_BIN}" CACHE STRING "" FORCE)
|
||||
endif()
|
||||
|
||||
set(CMAKE_MAKE_PROGRAM "${NINJA_BIN}" CACHE STRING "" FORCE)
|
||||
list(POP_BACK CMAKE_MESSAGE_INDENT)
|
||||
+51
-29
@@ -20,13 +20,29 @@ cmake_minimum_required(VERSION 3.30...4.0)
|
||||
include_guard(GLOBAL)
|
||||
list(APPEND CMAKE_MESSAGE_INDENT "[LLVM] ")
|
||||
|
||||
if(CMAKE_C_COMPILER OR CMAKE_CXX_COMPILER)
|
||||
return()
|
||||
endif()
|
||||
# Necessary for propagation into the try_compile CMake subprocesses. It's unclear why this is not the default behavior.
|
||||
foreach(_T IN ITEMS CMAKE_AR CMAKE_RANLIB CMAKE_LINKER CMAKE_C_COMPILER CMAKE_C_COMPILER_AR CMAKE_C_COMPILER_RANLIB CMAKE_C_COMPILER_LINKER CMAKE_C_COMPILER_LINKER_ID CMAKE_C_COMPILER_LINKER_VERSION CMAKE_CXX_COMPILER CMAKE_CXX_COMPILER_AR CMAKE_CXX_COMPILER_RANLIB CMAKE_CXX_COMPILER_LINKER CMAKE_CXX_COMPILER_LINKER_ID CMAKE_CXX_COMPILER_LINKER_VERSION CMAKE_ASM_COMPILER CMAKE_ASM_COMPILER_AR CMAKE_ASM_COMPILER_RANLIB CMAKE_ASM_COMPILER_LINKER CMAKE_ASM_COMPILER_LINKER_ID CMAKE_ASM_COMPILER_LINKER_VERSION CMAKE_RC_COMPILER CMAKE_RC_COMPILER_AR CMAKE_RC_COMPILER_RANLIB CMAKE_RC_COMPILER_LINKER CMAKE_RC_COMPILER_LINKER_ID CMAKE_RC_COMPILER_LINKER_VERSION)
|
||||
if(DEFINED ENV{${_T}})
|
||||
set(${_T} "$ENV{${_T}}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# Try and figure out what processor we need to get binaries for.
|
||||
set(LLVM_VERSION "19.1.7")
|
||||
if(CMAKE_HOST_SYSTEM_NAME MATCHES "[Ww]indows")
|
||||
if(
|
||||
(NOT IS_EXECUTABLE CMAKE_C_COMPILER) OR
|
||||
(NOT IS_EXECUTABLE CMAKE_C_COMPILER_AR) OR
|
||||
(NOT IS_EXECUTABLE CMAKE_C_COMPILER_RANLIB) OR
|
||||
(NOT IS_EXECUTABLE CMAKE_C_COMPILER_LINKER) OR
|
||||
(NOT IS_EXECUTABLE CMAKE_CXX_COMPILER) OR
|
||||
(NOT IS_EXECUTABLE CMAKE_CXX_COMPILER_AR) OR
|
||||
(NOT IS_EXECUTABLE CMAKE_CXX_COMPILER_RANLIB) OR
|
||||
(NOT IS_EXECUTABLE CMAKE_CXX_COMPILER_LINKER) OR
|
||||
(NOT IS_EXECUTABLE CMAKE_LINKER) OR
|
||||
(NOT IS_EXECUTABLE CMAKE_RANLIB) OR
|
||||
(NOT IS_EXECUTABLE CMAKE_AR)
|
||||
)
|
||||
# Try and figure out what processor we need to get binaries for.
|
||||
set(LLVM_VERSION "19.1.7")
|
||||
if(CMAKE_HOST_SYSTEM_NAME MATCHES "[Ww]indows")
|
||||
set(_OS "windows")
|
||||
string(TOLOWER "$ENV{PROCESSOR_ARCHITECTURE}" _ARCH)
|
||||
if(_ARCH MATCHES "(amd64)|(AMD64)")
|
||||
@@ -53,7 +69,7 @@ if(CMAKE_HOST_SYSTEM_NAME MATCHES "[Ww]indows")
|
||||
"C:/Program Files/7-Zip"
|
||||
"C:/Program Files (x86)/7-Zip"
|
||||
)
|
||||
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "[Dd]arwin")
|
||||
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "[Dd]arwin")
|
||||
set(_OS "macos")
|
||||
execute_process(
|
||||
COMMAND "uname -m"
|
||||
@@ -67,7 +83,7 @@ elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "[Dd]arwin")
|
||||
set(_FILE_NAME "LLVM-${LLVM_VERSION}-MacOS-ARM64")
|
||||
endif()
|
||||
set(_FILE_EXT "tar.xz")
|
||||
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "[Oo]pen[Bb][Ss][Dd]")
|
||||
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "[Oo]pen[Bb][Ss][Dd]")
|
||||
set(_OS "openbsd")
|
||||
execute_process(
|
||||
COMMAND "arch"
|
||||
@@ -80,7 +96,7 @@ elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "[Oo]pen[Bb][Ss][Dd]")
|
||||
else()
|
||||
set(_FILE_NAME "LLVM-${LLVM_VERSION}-Linux-ARM64")
|
||||
endif()
|
||||
else()
|
||||
else()
|
||||
set(_OS "linux")
|
||||
execute_process(
|
||||
COMMAND "uname -p"
|
||||
@@ -102,10 +118,10 @@ else()
|
||||
else()
|
||||
set(_FILE_NAME "LLVM-${LLVM_VERSION}-Linux-ARM64")
|
||||
endif()
|
||||
endif()
|
||||
set(LLVM_DIR "${CMAKE_SOURCE_DIR}/extra/llvm-${LLVM_VERSION}-${_OS}-${_ARCH}")
|
||||
endif()
|
||||
set(LLVM_DIR "${CMAKE_SOURCE_DIR}/extra/llvm-${LLVM_VERSION}-${_OS}-${_ARCH}")
|
||||
|
||||
macro(find_llvm)
|
||||
macro(find_llvm)
|
||||
set(LLVM_FOUND "FALSE")
|
||||
|
||||
# - AR
|
||||
@@ -232,20 +248,20 @@ macro(find_llvm)
|
||||
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()
|
||||
# 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()
|
||||
if(LLVM_CLANG_VERSION AND LLVM_CLANG_VERSION VERSION_LESS LLVM_VERSION)
|
||||
# Try and find an existing LLVM installation.
|
||||
find_llvm()
|
||||
if(LLVM_CLANG_VERSION AND LLVM_CLANG_VERSION VERSION_LESS LLVM_VERSION)
|
||||
message(STATUS "Found outdated v${LLVM_CLANG_VERSION}.")
|
||||
elseif(NOT LLVM_FOUND)
|
||||
elseif(NOT LLVM_FOUND)
|
||||
message(STATUS "No installed LLVM found.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT LLVM_FOUND OR (LLVM_CLANG_VERSION VERSION_LESS LLVM_VERSION))
|
||||
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/.")
|
||||
@@ -286,9 +302,9 @@ if(NOT LLVM_FOUND OR (LLVM_CLANG_VERSION VERSION_LESS LLVM_VERSION))
|
||||
# Final stuff
|
||||
#message(STATUS "Testing...")
|
||||
find_llvm()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(LLVM_FOUND AND (LLVM_CLANG_VERSION VERSION_GREATER_EQUAL LLVM_VERSION))
|
||||
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)
|
||||
@@ -324,12 +340,18 @@ if(LLVM_FOUND AND (LLVM_CLANG_VERSION VERSION_GREATER_EQUAL LLVM_VERSION))
|
||||
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()
|
||||
# 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}\"")
|
||||
|
||||
foreach(_T IN ITEMS CMAKE_AR CMAKE_RANLIB CMAKE_LINKER CMAKE_C_COMPILER CMAKE_C_COMPILER_AR CMAKE_C_COMPILER_RANLIB CMAKE_C_COMPILER_LINKER CMAKE_C_COMPILER_LINKER_ID CMAKE_C_COMPILER_LINKER_VERSION CMAKE_CXX_COMPILER CMAKE_CXX_COMPILER_AR CMAKE_CXX_COMPILER_RANLIB CMAKE_CXX_COMPILER_LINKER CMAKE_CXX_COMPILER_LINKER_ID CMAKE_CXX_COMPILER_LINKER_VERSION CMAKE_ASM_COMPILER CMAKE_ASM_COMPILER_AR CMAKE_ASM_COMPILER_RANLIB CMAKE_ASM_COMPILER_LINKER CMAKE_ASM_COMPILER_LINKER_ID CMAKE_ASM_COMPILER_LINKER_VERSION CMAKE_RC_COMPILER CMAKE_RC_COMPILER_AR CMAKE_RC_COMPILER_RANLIB CMAKE_RC_COMPILER_LINKER CMAKE_RC_COMPILER_LINKER_ID CMAKE_RC_COMPILER_LINKER_VERSION)
|
||||
set(ENV{${_T}} "${${_T}}")
|
||||
endforeach()
|
||||
else()
|
||||
message(FATAL_ERROR "Failed to find or provide a compatible LLVM installation.")
|
||||
endif()
|
||||
|
||||
endif()
|
||||
|
||||
list(POP_BACK CMAKE_MESSAGE_INDENT)
|
||||
Reference in New Issue
Block a user