[cmake-developers] [PATCH v2] Allow custom lib suffix be used as find path
Christian Schmidbauer
ch.schmidbauer at gmail.com
Sat Feb 25 14:15:26 EST 2017
Inspired by commit 896ad25 for bug #11260, this commit allows to use the
variable CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX to be used as find path.
Allowing the find path to be more deterministic on custom setups.
A similar idea has already been suggested in #10287 and is required for
bug #15994.
v2: - Change path variable a string to be specified as suffix directly.
- Make path variable non-global
- Fix find_library test
- strip FindPackage, as testing is ambigous in such scenario
---
Help/command/find_library.rst | 6 +++++
Source/cmFindLibraryCommand.cxx | 28 ++++++++++++----------
Tests/CMakeOnly/find_library/CMakeLists.txt | 15 +++++++++++-
.../CMakeOnly/find_library/lib/A/libXYZ/libtest2.a | 0
Tests/CMakeOnly/find_library/lib/XYZ/libtest1.a | 0
.../CMakeOnly/find_library/libXYZ/A/lib/libtest4.a | 0
.../find_library/libXYZ/A/libXYZ/libtest5.a | 0
Tests/CMakeOnly/find_library/libXYZ/A/libtest6.a | 0
Tests/CMakeOnly/find_library/libXYZ/libtest7.a | 0
9 files changed, 35 insertions(+), 14 deletions(-)
create mode 100644 Tests/CMakeOnly/find_library/lib/A/libXYZ/libtest2.a
create mode 100644 Tests/CMakeOnly/find_library/lib/XYZ/libtest1.a
create mode 100644 Tests/CMakeOnly/find_library/libXYZ/A/lib/libtest4.a
create mode 100644 Tests/CMakeOnly/find_library/libXYZ/A/libXYZ/libtest5.a
create mode 100644 Tests/CMakeOnly/find_library/libXYZ/A/libtest6.a
create mode 100644 Tests/CMakeOnly/find_library/libXYZ/libtest7.a
diff --git a/Help/command/find_library.rst b/Help/command/find_library.rst
index 1eb50f7..d6c0e8a 100644
--- a/Help/command/find_library.rst
+++ b/Help/command/find_library.rst
@@ -49,6 +49,12 @@ path to the framework ``<fullPath>/A.framework``. When a full path to a
framework is used as a library, CMake will use a ``-framework A``, and a
``-F<fullPath>`` to link the framework to the target.
+If the property `CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX` is set all search
+paths will be tested as normal, with the suffix appended, and with all matches
+of ``lib/`` replaced with `lib${CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX}/`.
+This property overrides both `FIND_LIBRARY_USE_LIB32_PATHS` and
+`FIND_LIBRARY_USE_LIB64_PATHS`.
+
If the :prop_gbl:`FIND_LIBRARY_USE_LIB32_PATHS` global property is set
all search paths will be tested as normal, with ``32/`` appended, and
with all matches of ``lib/`` replaced with ``lib32/``. This property is
diff --git a/Source/cmFindLibraryCommand.cxx b/Source/cmFindLibraryCommand.cxx
index 082350f..50ee3ae 100644
--- a/Source/cmFindLibraryCommand.cxx
+++ b/Source/cmFindLibraryCommand.cxx
@@ -31,20 +31,22 @@ bool cmFindLibraryCommand::InitialPass(std::vector<std::string> const& argsIn,
return true;
}
- if (this->Makefile->GetState()->GetGlobalPropertyAsBool(
- "FIND_LIBRARY_USE_LIB32_PATHS")) {
- // add special 32 bit paths if this is a 32 bit compile.
- if (this->Makefile->PlatformIs32Bit()) {
- this->AddArchitecturePaths("32");
- }
+ // add custom lib<qual> paths instead of using fixed lib32 or lib64
+ if (this->Makefile->GetDefinition("CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX")) {
+ this->AddArchitecturePaths(
+ this->Makefile->GetDefinition("CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX"));
}
-
- if (this->Makefile->GetState()->GetGlobalPropertyAsBool(
- "FIND_LIBRARY_USE_LIB64_PATHS")) {
- // add special 64 bit paths if this is a 64 bit compile.
- if (this->Makefile->PlatformIs64Bit()) {
- this->AddArchitecturePaths("64");
- }
+ // add special 32 bit paths if this is a 32 bit compile.
+ else if (this->Makefile->PlatformIs32Bit() &&
+ this->Makefile->GetState()->GetGlobalPropertyAsBool(
+ "FIND_LIBRARY_USE_LIB32_PATHS")) {
+ this->AddArchitecturePaths("32");
+ }
+ // add special 64 bit paths if this is a 64 bit compile.
+ else if (this->Makefile->PlatformIs64Bit() &&
+ this->Makefile->GetState()->GetGlobalPropertyAsBool(
+ "FIND_LIBRARY_USE_LIB64_PATHS")) {
+ this->AddArchitecturePaths("64");
}
std::string library = this->FindLibrary();
diff --git a/Tests/CMakeOnly/find_library/CMakeLists.txt b/Tests/CMakeOnly/find_library/CMakeLists.txt
index 9958650..9c1aad8 100644
--- a/Tests/CMakeOnly/find_library/CMakeLists.txt
+++ b/Tests/CMakeOnly/find_library/CMakeLists.txt
@@ -24,7 +24,7 @@ endmacro()
macro(test_find_library_subst expected)
get_filename_component(dir ${expected} PATH)
get_filename_component(name ${expected} NAME)
- string(REGEX REPLACE "lib/?64" "lib" dir "${dir}")
+ string(REGEX REPLACE "lib/?[36X][24Y][Z]*" "lib" dir "${dir}")
test_find_library(", searched as ${dir}" "${expected}"
NAMES ${name}
PATHS ${CMAKE_CURRENT_SOURCE_DIR}/${dir}
@@ -79,3 +79,16 @@ test_find_library("" A/libtestA.a
NAMES testB testA NAMES_PER_DIR
PATHS ${CMAKE_CURRENT_SOURCE_DIR}/A ${CMAKE_CURRENT_SOURCE_DIR}/B
)
+
+set(CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX "XYZ")
+foreach(libXYZ
+ lib/XYZ/libtest1.a
+ lib/A/libXYZ/libtest2.a
+ lib/libtest3.a
+ libXYZ/A/lib/libtest4.a
+ libXYZ/A/libXYZ/libtest5.a
+ libXYZ/A/libtest6.a
+ libXYZ/libtest7.a
+ )
+ test_find_library_subst(${libXYZ})
+endforeach()
diff --git a/Tests/CMakeOnly/find_library/lib/A/libXYZ/libtest2.a b/Tests/CMakeOnly/find_library/lib/A/libXYZ/libtest2.a
new file mode 100644
index 0000000..e69de29
diff --git a/Tests/CMakeOnly/find_library/lib/XYZ/libtest1.a b/Tests/CMakeOnly/find_library/lib/XYZ/libtest1.a
new file mode 100644
index 0000000..e69de29
diff --git a/Tests/CMakeOnly/find_library/libXYZ/A/lib/libtest4.a b/Tests/CMakeOnly/find_library/libXYZ/A/lib/libtest4.a
new file mode 100644
index 0000000..e69de29
diff --git a/Tests/CMakeOnly/find_library/libXYZ/A/libXYZ/libtest5.a b/Tests/CMakeOnly/find_library/libXYZ/A/libXYZ/libtest5.a
new file mode 100644
index 0000000..e69de29
diff --git a/Tests/CMakeOnly/find_library/libXYZ/A/libtest6.a b/Tests/CMakeOnly/find_library/libXYZ/A/libtest6.a
new file mode 100644
index 0000000..e69de29
diff --git a/Tests/CMakeOnly/find_library/libXYZ/libtest7.a b/Tests/CMakeOnly/find_library/libXYZ/libtest7.a
new file mode 100644
index 0000000..e69de29
--
2.10.2
More information about the cmake-developers
mailing list