mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 02:08:27 +08:00
Apple: Fix linking to frameworks that do not exist until build time
Fixes: #21621
This commit is contained in:
@@ -699,9 +699,13 @@ void cmComputeLinkInformation::AddItem(BT<std::string> const& item,
|
||||
} else {
|
||||
// This is not a CMake target. Use the name given.
|
||||
if (cmSystemTools::FileIsFullPath(item.Value)) {
|
||||
if (cmSystemTools::FileIsDirectory(item.Value)) {
|
||||
if (cmSystemTools::IsPathToFramework(item.Value) &&
|
||||
this->Makefile->IsOn("APPLE")) {
|
||||
// This is a framework.
|
||||
this->AddFrameworkItem(item.Value);
|
||||
} else if (cmSystemTools::FileIsDirectory(item.Value)) {
|
||||
// This is a directory.
|
||||
this->AddDirectoryItem(item.Value);
|
||||
this->DropDirectoryItem(item.Value);
|
||||
} else {
|
||||
// Use the full path given to the library file.
|
||||
this->Depends.push_back(item.Value);
|
||||
@@ -1306,16 +1310,6 @@ void cmComputeLinkInformation::AddFrameworkItem(std::string const& item)
|
||||
}
|
||||
}
|
||||
|
||||
void cmComputeLinkInformation::AddDirectoryItem(std::string const& item)
|
||||
{
|
||||
if (this->Makefile->IsOn("APPLE") &&
|
||||
cmSystemTools::IsPathToFramework(item)) {
|
||||
this->AddFrameworkItem(item);
|
||||
} else {
|
||||
this->DropDirectoryItem(item);
|
||||
}
|
||||
}
|
||||
|
||||
void cmComputeLinkInformation::DropDirectoryItem(std::string const& item)
|
||||
{
|
||||
// A full path to a directory was found as a link item. Warn the
|
||||
|
@@ -155,7 +155,6 @@ private:
|
||||
void AddFullItem(BT<std::string> const& item);
|
||||
bool CheckImplicitDirItem(std::string const& item);
|
||||
void AddUserItem(BT<std::string> const& item, bool pathNotKnown);
|
||||
void AddDirectoryItem(std::string const& item);
|
||||
void AddFrameworkItem(std::string const& item);
|
||||
void DropDirectoryItem(std::string const& item);
|
||||
bool CheckSharedLibNoSOName(std::string const& item);
|
||||
|
@@ -84,3 +84,19 @@ if(NOT XCODE OR NOT XCODE_VERSION VERSION_LESS 5)
|
||||
endif()
|
||||
|
||||
include(CPack)
|
||||
|
||||
if(APPLE)
|
||||
set(ExternalFramework_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/External")
|
||||
file(REMOVE_RECURSE "${ExternalFramework_INSTALL_DIR}")
|
||||
|
||||
include(ExternalProject)
|
||||
ExternalProject_Add(ExternalFramework
|
||||
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/External"
|
||||
INSTALL_DIR "${ExternalFramework_INSTALL_DIR}"
|
||||
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
|
||||
)
|
||||
|
||||
add_executable(useExternal useExternal.c)
|
||||
target_link_libraries(useExternal PRIVATE "${ExternalFramework_INSTALL_DIR}/lib/External.framework")
|
||||
add_dependencies(useExternal ExternalFramework)
|
||||
endif()
|
||||
|
5
Tests/Framework/External/CMakeLists.txt
vendored
Normal file
5
Tests/Framework/External/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.19)
|
||||
project(ExternalFramework C)
|
||||
add_library(External SHARED external.c)
|
||||
set_property(TARGET External PROPERTY FRAMEWORK 1)
|
||||
install(TARGETS External DESTINATION lib)
|
4
Tests/Framework/External/external.c
vendored
Normal file
4
Tests/Framework/External/external.c
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
int external(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
6
Tests/Framework/useExternal.c
Normal file
6
Tests/Framework/useExternal.c
Normal file
@@ -0,0 +1,6 @@
|
||||
extern int external(void);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return external();
|
||||
}
|
Reference in New Issue
Block a user