
The current regular expression is able to match `/usr/lib/<arch>`,
`/usr/usr/lib/<arch>`, `/usr/usr/usr/lib/<arch>`, ... but not
`/lib/<arch>`.
This behavior ends up causing the detected architecture to
be x86_64-pc-linux-gnu when the Clang compiler is installed on
a "non-system" location (like /opt/llvm-13) which, in turn, makes
almost every 'find_library()' fail because the correct
architecture is x86_64-linux-gnu.
This is due to a typo in commit 764606e256
(CMakeDetermineCompilerABI:
Extract lib arch from implicit object file paths, 2021-04-05,
v3.20.1~10^2), which used `+` instead of `?`.
55 lines
1.7 KiB
CMake
55 lines
1.7 KiB
CMake
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
|
|
|
cmake_policy(PUSH)
|
|
cmake_policy(SET CMP0053 NEW)
|
|
cmake_policy(SET CMP0054 NEW)
|
|
|
|
# Function parse implicit linker options.
|
|
# This is used internally by CMake and should not be included by user
|
|
# code.
|
|
|
|
function(cmake_parse_library_architecture lang implicit_dirs implicit_objs output_var)
|
|
unset(library_arch)
|
|
# Detect library architecture directory name.
|
|
if(CMAKE_LIBRARY_ARCHITECTURE_REGEX)
|
|
foreach(dir IN LISTS implicit_dirs)
|
|
if("${dir}" MATCHES "/lib/${CMAKE_LIBRARY_ARCHITECTURE_REGEX}$")
|
|
get_filename_component(arch "${dir}" NAME)
|
|
set(library_arch "${arch}")
|
|
break()
|
|
endif()
|
|
endforeach()
|
|
|
|
foreach(obj IN LISTS implicit_objs)
|
|
get_filename_component(dir "${obj}" DIRECTORY)
|
|
if("${dir}" MATCHES "(/usr)?/lib/${CMAKE_LIBRARY_ARCHITECTURE_REGEX}$")
|
|
get_filename_component(arch "${dir}" NAME)
|
|
set(library_arch "${arch}")
|
|
break()
|
|
endif()
|
|
endforeach()
|
|
endif()
|
|
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL QCC)
|
|
foreach(dir ${implicit_dirs})
|
|
if (dir MATCHES "/lib$")
|
|
get_filename_component(assumedArchDir "${dir}" DIRECTORY)
|
|
get_filename_component(archParentDir "${assumedArchDir}" DIRECTORY)
|
|
if (archParentDir STREQUAL CMAKE_SYSROOT)
|
|
get_filename_component(archDirName "${assumedArchDir}" NAME)
|
|
set(library_arch "${archDirName}")
|
|
break()
|
|
endif()
|
|
endif()
|
|
endforeach()
|
|
endif()
|
|
|
|
# Return results.
|
|
if(library_arch)
|
|
set(${output_var} "${library_arch}" PARENT_SCOPE)
|
|
endif()
|
|
endfunction()
|
|
|
|
cmake_policy(POP)
|