mirror of
https://github.com/Kitware/CMake.git
synced 2026-02-23 15:38:52 -06:00
find_library: Infer library prefix and suffix when in script mode
This aligns `find_library` with the documentation that states it can be called from script mode. This is done by infering the proper prefix and suffix values when `find_library` is called when the `CMAKE_FIND_LIBRARY*` are not set. This also means that `find_library` won't produce obscure error messages about unset definitions. Fixes: #22027
This commit is contained in:
committed by
Brad King
parent
a42b753c41
commit
aa3ab3eb92
@@ -259,6 +259,34 @@ struct cmFindLibraryHelper
|
||||
};
|
||||
};
|
||||
|
||||
namespace {
|
||||
|
||||
std::string const& get_prefixes(cmMakefile* mf)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
static std::string defaultPrefix = ";lib";
|
||||
#else
|
||||
static std::string defaultPrefix = "lib";
|
||||
#endif
|
||||
cmProp prefixProp = mf->GetDefinition("CMAKE_FIND_LIBRARY_PREFIXES");
|
||||
return (prefixProp) ? *prefixProp : defaultPrefix;
|
||||
}
|
||||
|
||||
std::string const& get_suffixes(cmMakefile* mf)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
static std::string defaultSuffix = ".lib;.dll.a;.a";
|
||||
#elif defined(__APPLE__)
|
||||
static std::string defaultSuffix = ".tbd;.dylib;.so;.a";
|
||||
#elif defined(__hpux)
|
||||
static std::string defaultSuffix = ".sl;.so;.a";
|
||||
#else
|
||||
static std::string defaultSuffix = ".so;.a";
|
||||
#endif
|
||||
cmProp suffixProp = mf->GetDefinition("CMAKE_FIND_LIBRARY_SUFFIXES");
|
||||
return (suffixProp) ? *suffixProp : defaultSuffix;
|
||||
}
|
||||
}
|
||||
cmFindLibraryHelper::cmFindLibraryHelper(std::string debugName, cmMakefile* mf,
|
||||
cmFindBase const* base)
|
||||
: Makefile(mf)
|
||||
@@ -268,10 +296,9 @@ cmFindLibraryHelper::cmFindLibraryHelper(std::string debugName, cmMakefile* mf,
|
||||
this->GG = this->Makefile->GetGlobalGenerator();
|
||||
|
||||
// Collect the list of library name prefixes/suffixes to try.
|
||||
std::string const& prefixes_list =
|
||||
this->Makefile->GetRequiredDefinition("CMAKE_FIND_LIBRARY_PREFIXES");
|
||||
std::string const& suffixes_list =
|
||||
this->Makefile->GetRequiredDefinition("CMAKE_FIND_LIBRARY_SUFFIXES");
|
||||
std::string const& prefixes_list = get_prefixes(this->Makefile);
|
||||
std::string const& suffixes_list = get_suffixes(this->Makefile);
|
||||
|
||||
cmExpandList(prefixes_list, this->Prefixes, true);
|
||||
cmExpandList(suffixes_list, this->Suffixes, true);
|
||||
this->RegexFromList(this->PrefixRegexStr, this->Prefixes);
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
.*find_library considered the following locations.*
|
||||
.*\(lib\)library_no_exist\(\\.tbd\|\\.dylib\|\\.so\|\\.a\).*
|
||||
.*The item was found at.*
|
||||
.*lib/libcreated.a.*
|
||||
@@ -0,0 +1,4 @@
|
||||
.*find_library considered the following locations.*
|
||||
.*\(\|lib\)library_no_exist\(\\.lib\|\\.dll\\.a\|\\.a\).*
|
||||
.*The item was found at.*
|
||||
.*lib/libcreated.a.*
|
||||
4
Tests/RunCMake/find_library/FromScriptMode-stderr.txt
Normal file
4
Tests/RunCMake/find_library/FromScriptMode-stderr.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
.*find_library considered the following locations.*
|
||||
.*\(lib\)library_no_exist\(\\.so\|\\.a\).*
|
||||
.*The item was found at.*
|
||||
.*lib/libcreated.a.*
|
||||
15
Tests/RunCMake/find_library/FromScriptMode.cmake
Normal file
15
Tests/RunCMake/find_library/FromScriptMode.cmake
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
if(TEMP_DIR)
|
||||
file(REMOVE_RECURSE "${TEMP_DIR}")
|
||||
file(MAKE_DIRECTORY "${TEMP_DIR}")
|
||||
file(MAKE_DIRECTORY "${TEMP_DIR}/lib")
|
||||
file(WRITE "${TEMP_DIR}/lib/libcreated.a" "created")
|
||||
endif()
|
||||
|
||||
set(CMAKE_FIND_DEBUG_MODE 1)
|
||||
find_library(CREATED_LIBRARY NAMES library_no_exist)
|
||||
|
||||
set(CMAKE_PREFIX_PATH "${TEMP_DIR}")
|
||||
find_library(CREATED_LIBRARY NAMES created)
|
||||
message(STATUS "CREATED_LIBRARY='${CREATED_LIBRARY}'")
|
||||
set(CMAKE_FIND_DEBUG_MODE 0)
|
||||
@@ -10,3 +10,5 @@ endif()
|
||||
run_cmake(PrefixInPATH)
|
||||
run_cmake(Required)
|
||||
run_cmake(NO_CACHE)
|
||||
|
||||
run_cmake_script(FromScriptMode "-DTEMP_DIR=${RunCMake_BINARY_DIR}/FromScriptMode-temp")
|
||||
|
||||
Reference in New Issue
Block a user