qt6windows7/cmake/QtGenerateLibHelpers.cmake
2023-10-29 23:33:08 +01:00

126 lines
5.0 KiB
CMake

# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
# Given "/usr/lib/x86_64-linux-gnu/libcups.so"
# Returns "cups" or an empty string if the file is not an absolute library path.
# Aka it strips the "lib" prefix, the .so extension and the base path.
function(qt_get_library_name_without_prefix_and_suffix out_var file_path)
set(out_value "")
if(IS_ABSOLUTE "${file_path}")
get_filename_component(basename "${file_path}" NAME_WE)
get_filename_component(ext "${file_path}" EXT)
string(TOLOWER "${ext}" ext_lower)
foreach(libsuffix ${LIBRARY_SUFFIXES})
# Handle weird prefix extensions like in the case of
# "/usr/lib/x86_64-linux-gnu/libglib-2.0.so"
# it's ".0.so".
if(ext_lower MATCHES "^(\\.[0-9]+)*${libsuffix}(\\.[0-9]+)*")
set(is_linkable_library TRUE)
set(weird_numbered_extension "${CMAKE_MATCH_1}")
break()
endif()
endforeach()
if(is_linkable_library)
set(out_value "${basename}")
if(LIBRARY_PREFIXES)
foreach(libprefix ${LIBRARY_PREFIXES})
# Strip any library prefix like "lib" for a library that we will use with a link
# flag.
if(libprefix AND out_value MATCHES "^${libprefix}(.+)")
set(out_value "${CMAKE_MATCH_1}")
break()
endif()
endforeach()
endif()
if(weird_numbered_extension)
set(out_value "${out_value}${weird_numbered_extension}")
endif()
endif()
endif()
# Reverse the dependency order to be in sync with what qmake generated .pri files
# have.
list(REVERSE out_list)
set(${out_var} "${out_value}" PARENT_SCOPE)
endfunction()
# Given "/usr/lib/x86_64-linux-gnu/libcups.so"
# Returns "-lcups" or an empty string if the file is not an absolute library path.
function(qt_get_library_with_link_flag out_var file_path)
qt_get_library_name_without_prefix_and_suffix(lib_name "${file_path}")
set(out_value "")
if(lib_name)
set(out_value "${lib_name}")
if(LINK_LIBRARY_FLAG)
string(PREPEND out_value "${LINK_LIBRARY_FLAG}")
endif()
endif()
set(${out_var} "${out_value}" PARENT_SCOPE)
endfunction()
# Given a list of potential library paths, returns a transformed list where absolute library paths
# are replaced with library link flags.
function(qt_transform_absolute_library_paths_to_link_flags out_var library_path_list)
set(out_list "")
foreach(library_path ${library_path_list})
qt_get_library_with_link_flag(lib_name_with_link_flag "${library_path}")
if(lib_name_with_link_flag)
string(TOLOWER "${IMPLICIT_LINK_DIRECTORIES}" IMPLICIT_LINK_DIRECTORIES_LOWER)
get_filename_component(dir "${library_path}" DIRECTORY)
string(TOLOWER "${dir}" dir_lower)
# If library_path isn't in default link directories, we should add it to link flags.
list(FIND IMPLICIT_LINK_DIRECTORIES_LOWER "${dir_lower}" index)
if(${index} EQUAL -1)
list(APPEND out_list "-L\"${dir}\"")
endif()
list(APPEND out_list "${lib_name_with_link_flag}")
else()
list(APPEND out_list "${library_path}")
endif()
endforeach()
set(${out_var} "${out_list}" PARENT_SCOPE)
endfunction()
function(qt_strip_library_version_suffix out_var file_path)
get_filename_component(dir "${file_path}" DIRECTORY)
get_filename_component(basename "${file_path}" NAME_WE)
get_filename_component(ext "${file_path}" EXT)
foreach(libsuffix ${LIBRARY_SUFFIXES})
if(ext MATCHES "^${libsuffix}(\\.[0-9]+)+")
set(ext ${libsuffix})
break()
endif()
endforeach()
set(final_value "${basename}${ext}")
if(dir)
set(final_value "${dir}/${final_value}")
endif()
set(${out_var} "${final_value}" PARENT_SCOPE)
endfunction()
# Checks if `input_path` is relative to at least one path given in the list of `qt_lib_paths`.
# Sets TRUE or FALSE in `out_var_is_relative`.
# Assigns the relative path to `out_var_relative_path` if the path is relative, otherwise assigns
# the original path.
function(qt_internal_path_is_relative_to_qt_lib_path
input_path qt_lib_paths out_var_is_relative out_var_relative_path)
set(is_relative "FALSE")
set(relative_path_value "${input_path}")
foreach(qt_lib_path ${qt_lib_paths})
file(RELATIVE_PATH relative_path "${qt_lib_path}" "${input_path}")
if(IS_ABSOLUTE "${relative_path}" OR (relative_path MATCHES "^\\.\\."))
set(is_relative "FALSE")
else()
set(is_relative "TRUE")
set(relative_path_value "${relative_path}")
break()
endif()
endforeach()
set(${out_var_is_relative} "${is_relative}" PARENT_SCOPE)
set(${out_var_relative_path} "${relative_path_value}" PARENT_SCOPE)
endfunction()