Xcode: Avoid mutating App Bundle targets during generation

For `MACOSX_BUNDLE` targets we generate an `Info.plist` automatically
and add it to the sources presented to Xcode.  Avoid mutating the
original target's list of sources to achieve this.  Otherwise when we
generate the same target again (e.g. in a sub-project's Xcode file) it
will look different than the first time and possibly break invariants.

Fixes: #19114
This commit is contained in:
Brad King
2019-04-10 08:04:15 -04:00
parent b4385d5ccc
commit 428c1e429f
2 changed files with 21 additions and 8 deletions

View File

@@ -1142,6 +1142,13 @@ bool cmGlobalXCodeGenerator::CreateXCodeTarget(
// Add CMakeLists.txt file for user convenience.
this->AddXCodeProjBuildRule(gtgt, classes);
// Add the Info.plist we are about to generate for an App Bundle.
if (gtgt->GetPropertyAsBool("MACOSX_BUNDLE")) {
std::string plist = this->ComputeInfoPListLocation(gtgt);
cmSourceFile* sf = gtgt->Makefile->GetOrCreateSource(plist, true);
classes.push_back(sf);
}
std::sort(classes.begin(), classes.end(), cmSourceFilePathCompare());
gtgt->ComputeObjectMapping();
@@ -2883,14 +2890,6 @@ bool cmGlobalXCodeGenerator::CreateGroups(
this->GroupMap[key] = pbxgroup;
};
// add the soon to be generated Info.plist file as a source for a
// MACOSX_BUNDLE file
if (gtgt->GetPropertyAsBool("MACOSX_BUNDLE")) {
std::string plist = this->ComputeInfoPListLocation(gtgt);
mf->GetOrCreateSource(plist, true);
gtgt->AddSource(plist);
}
// Put cmSourceFile instances in proper groups:
for (auto const& si : gtgt->GetAllConfigSources()) {
cmSourceFile const* sf = si.Source;
@@ -2909,6 +2908,13 @@ bool cmGlobalXCodeGenerator::CreateGroups(
cmSourceFile* sf = gtgt->Makefile->GetOrCreateSource(listfile);
addSourceToGroup(sf->GetFullPath());
}
// Add the Info.plist we are about to generate for an App Bundle.
if (gtgt->GetPropertyAsBool("MACOSX_BUNDLE")) {
std::string plist = this->ComputeInfoPListLocation(gtgt);
cmSourceFile* sf = gtgt->Makefile->GetOrCreateSource(plist, true);
addSourceToGroup(sf->GetFullPath());
}
}
}
return true;

View File

@@ -1,3 +1,5 @@
project(BundleSubDir)
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/randomResourceFile.plist"
COMMAND /bin/cp
@@ -34,3 +36,8 @@ install(TARGETS SecondBundle DESTINATION Applications)
# bundle does not respect the name. Also the executable will not be found by
# the test driver if this does not work.
set_target_properties(SecondBundle PROPERTIES OUTPUT_NAME SecondBundleExe)
# Express one app bundle in terms of another's SOURCES to verify that
# the generators do not expose the Info.plist of one to the other.
add_executable(SubdirBundle1 MACOSX_BUNDLE EXCLUDE_FROM_ALL ../BundleTest.cxx)
add_executable(SubdirBundle2 MACOSX_BUNDLE EXCLUDE_FROM_ALL $<TARGET_PROPERTY:SubdirBundle1,SOURCES>)