1
0
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:
Brad King
2020-12-18 13:44:44 -05:00
committed by Craig Scott
parent 0c86d15459
commit 375b307bae
6 changed files with 37 additions and 13 deletions

View File

@@ -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

View File

@@ -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);

View File

@@ -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()

View 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
View File

@@ -0,0 +1,4 @@
int external(void)
{
return 0;
}

View File

@@ -0,0 +1,6 @@
extern int external(void);
int main(void)
{
return external();
}