Merge topic 'restore-link-interface-objlib-with-unity' into release-3.29

5b8e9e068f Restore support for TARGET_OBJECTS in link interfaces with unity builds
1313c78a9c Tests: Update RunCMake.TargetObjects cmake_minimum_required version

Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !9279
This commit is contained in:
Brad King
2024-02-22 13:26:00 +00:00
committed by Kitware Robot
9 changed files with 45 additions and 7 deletions

View File

@@ -727,7 +727,10 @@ public:
*/
void ClearSourcesCache();
// Do not use. This is only for a specific call site with a FIXME comment.
/**
* Clears cached evaluations of INTERFACE_LINK_LIBRARIES.
* They will be recomputed on demand.
*/
void ClearLinkInterfaceCache();
void AddSource(const std::string& src, bool before = false);

View File

@@ -1922,9 +1922,13 @@ bool cmGlobalGenerator::AddAutomaticSources()
// Clear the source list and classification cache (KindedSources) of all
// targets so that it will be recomputed correctly by the generators later
// now that the above transformations are done for all targets.
// Also clear the link interface cache to support $<TARGET_OBJECTS:objlib>
// in INTERFACE_LINK_LIBRARIES because the list of object files may have
// been changed by conversion to a unity build or addition of a PCH source.
for (const auto& lg : this->LocalGenerators) {
for (const auto& gt : lg->GetGeneratorTargets()) {
gt->ClearSourcesCache();
gt->ClearLinkInterfaceCache();
}
}
return true;

View File

@@ -2864,15 +2864,10 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target)
cm::nullopt, true);
} else if (reuseTarget->GetType() ==
cmStateEnums::OBJECT_LIBRARY) {
// FIXME: This can propagate more than one level, unlike
// the rest of the object files in an object library.
// Find another way to do this.
target->Target->AppendProperty(
"INTERFACE_LINK_LIBRARIES",
cmStrCat("$<$<CONFIG:", config,
">:$<LINK_ONLY:", pchSourceObj, ">>"));
// We updated the link interface, so ensure it is recomputed.
target->ClearLinkInterfaceCache();
}
}
} else {

View File

@@ -1,3 +1,3 @@
cmake_minimum_required(VERSION 3.3)
cmake_minimum_required(VERSION 3.5)
project(${RunCMake_TEST} LANGUAGES NONE)
include(${RunCMake_TEST}.cmake)

View File

@@ -6,3 +6,11 @@ run_cmake(NotObjlibTarget)
if(RunCMake_GENERATOR STREQUAL "Xcode" AND "$ENV{CMAKE_OSX_ARCHITECTURES}" MATCHES "[;$]")
run_cmake(XcodeVariableNoGenexExpansion)
endif()
function(run_cmake_and_build case)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-build)
run_cmake(${case})
set(RunCMake_TEST_NO_CLEAN 1)
run_cmake_command(${case}-build ${CMAKE_COMMAND} --build .)
endfunction()
run_cmake_and_build(Unity)

View File

@@ -0,0 +1,13 @@
enable_language(C)
# Test transforming the set of object files provided by an object library.
set(CMAKE_UNITY_BUILD 1)
add_library(UnityObj1 OBJECT UnityObj1.c)
add_library(UnityObj2 OBJECT UnityObj2.c)
add_library(UnityObj2Iface INTERFACE)
target_link_libraries(UnityObj2Iface INTERFACE $<TARGET_OBJECTS:UnityObj2>)
add_executable(UnityMain UnityMain.c)
target_link_libraries(UnityMain PRIVATE UnityObj1 UnityObj2Iface)

View File

@@ -0,0 +1,7 @@
extern int UnityObj1(void);
extern int UnityObj2(void);
int main(void)
{
return UnityObj1() + UnityObj2();
}

View File

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

View File

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