summaryrefslogtreecommitdiff
path: root/Modules/CMakeParseLibraryArchitecture.cmake
diff options
context:
space:
mode:
authorRobert Maynard <rmaynard@nvidia.com>2021-02-03 17:31:08 -0500
committerBrad King <brad.king@kitware.com>2021-02-04 15:17:49 -0500
commit657fc3a9a719831f9943c552e86e58ae283dad43 (patch)
tree244511bcf923be35fe38c22aea3a19580dbf93e6 /Modules/CMakeParseLibraryArchitecture.cmake
parentc28dbd7e308968089bf97df71d4fd74c99e718f1 (diff)
downloadcmake-657fc3a9a719831f9943c552e86e58ae283dad43.tar.gz
CMakeDetermineCompilerABI: Parse library arch from versioned paths
Teach CMake how to extract `CMAKE_<LANG>_LIBRARY_ARCHITECTURE` from versioned paths such as `/usr/lib/gcc/x86_64-linux-gnu/9`. These kind of paths are generated by NVHPC compilers.
Diffstat (limited to 'Modules/CMakeParseLibraryArchitecture.cmake')
-rw-r--r--Modules/CMakeParseLibraryArchitecture.cmake56
1 files changed, 56 insertions, 0 deletions
diff --git a/Modules/CMakeParseLibraryArchitecture.cmake b/Modules/CMakeParseLibraryArchitecture.cmake
new file mode 100644
index 0000000000..aa6fd741d7
--- /dev/null
+++ b/Modules/CMakeParseLibraryArchitecture.cmake
@@ -0,0 +1,56 @@
+# 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 implicit_dirs output_var)
+ unset(library_arch)
+ # Detect library architecture directory name.
+ if(CMAKE_LIBRARY_ARCHITECTURE_REGEX)
+ foreach(dir ${implicit_dirs})
+ if("${dir}" MATCHES "/lib/${CMAKE_LIBRARY_ARCHITECTURE_REGEX}$")
+ get_filename_component(arch "${dir}" NAME)
+ set(library_arch "${arch}")
+ break()
+ endif()
+ endforeach()
+ endif()
+
+ if(CMAKE_LIBRARY_ARCHITECTURE_REGEX_VERSIONED AND NOT library_arch)
+ foreach(dir ${implicit_dirs})
+ if("${dir}" MATCHES "/${CMAKE_LIBRARY_ARCHITECTURE_REGEX_VERSIONED}$")
+ get_filename_component(arch "${dir}" DIRECTORY)
+ get_filename_component(arch "${arch}" 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)