diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h index 738ed52b6b..f4990c5a2c 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h @@ -1007,9 +1007,9 @@ public: StringArray xcodeFrameworks, xcodeLibs; Array xcodeExtraPListEntries; - StringArray frameworkIDs, buildPhaseIDs, configIDs, sourceIDs, rezFileIDs; + StringArray frameworkIDs, buildPhaseIDs, configIDs, sourceIDs, rezFileIDs, dependencyIDs; StringArray frameworkNames; - String dependencyID, mainBuildProductID; + String mainBuildProductID; File infoPlistFile; struct SourceFileInfo @@ -1055,7 +1055,7 @@ public: jassert (xcodeFileType.isNotEmpty()); jassert (xcodeBundleExtension.isEmpty() || xcodeBundleExtension.startsWithChar ('.')); - if (ProjectExporter::BuildConfiguration::Ptr config = owner.getConfiguration(0)) + if (ProjectExporter::BuildConfiguration::Ptr config = owner.getConfiguration (0)) { auto productName = owner.replacePreprocessorTokens (*config, config->getTargetBinaryNameString (type == UnityPlugIn)); @@ -1081,24 +1081,42 @@ public: } //============================================================================== - void addDependency() + String addDependencyFor (const XcodeTarget& dependentTarget) { - jassert (dependencyID.isEmpty()); - - dependencyID = owner.createID (String ("__dependency") + getName()); + auto dependencyID = owner.createID (String ("__dependency") + getName() + dependentTarget.getName()); auto* v = new ValueTree (dependencyID); v->setProperty ("isa", "PBXTargetDependency", nullptr); v->setProperty ("target", getID(), nullptr); - owner.misc.add (v); + owner.pbxTargetDependencies.add (v); + return dependencyID; } - String getDependencyID() const + void addDependencies() { - jassert (dependencyID.isNotEmpty()); + if (! owner.project.isAudioPluginProject()) + return; - return dependencyID; + if (type == XcodeTarget::StandalonePlugIn) // depends on AUv3 and shared code + { + if (auto* auv3Target = owner.getTargetOfType (XcodeTarget::AudioUnitv3PlugIn)) + dependencyIDs.add (auv3Target->addDependencyFor (*this)); + + if (auto* sharedCodeTarget = owner.getTargetOfType (XcodeTarget::SharedCodeTarget)) + dependencyIDs.add (sharedCodeTarget->addDependencyFor (*this)); + } + else if (type == XcodeTarget::AggregateTarget) // depends on all other targets + { + for (auto* target : owner.targets) + if (target->type != XcodeTarget::AggregateTarget) + dependencyIDs.add (target->addDependencyFor (*this)); + } + else if (type != XcodeTarget::SharedCodeTarget) // shared code doesn't depend on anything; all other targets depend only on the shared code + { + if (auto* sharedCodeTarget = owner.getTargetOfType (XcodeTarget::SharedCodeTarget)) + dependencyIDs.add (sharedCodeTarget->addDependencyFor (*this)); + } } //============================================================================== @@ -1802,7 +1820,7 @@ private: bool xcodeCanUseDwarf; OwnedArray targets; - mutable OwnedArray pbxBuildFiles, pbxFileReferences, pbxGroups, misc, projectConfigs, targetConfigs; + mutable OwnedArray pbxBuildFiles, pbxFileReferences, pbxGroups, pbxTargetDependencies, misc, projectConfigs, targetConfigs; mutable StringArray resourceIDs, sourceIDs, targetIDs; mutable StringArray frameworkFileIDs, embeddedFrameworkIDs, rezFileIDs, resourceFileRefs, subprojectFileIDs; mutable Array> subprojectReferences; @@ -1903,6 +1921,8 @@ private: { for (auto* target : targets) { + target->addDependencies(); + if (target->type == XcodeTarget::AggregateTarget) continue; @@ -1919,7 +1939,6 @@ private: target->mainBuildProductID = fileID; pbxBuildFiles.add (v); - target->addDependency(); } } @@ -2142,7 +2161,7 @@ private: v->setProperty ("buildPhases", indentParenthesisedList (target.buildPhaseIDs), nullptr); v->setProperty ("buildRules", "( )", nullptr); - v->setProperty ("dependencies", indentParenthesisedList (getTargetDependencies (target)), nullptr); + v->setProperty ("dependencies", indentParenthesisedList (target.dependencyIDs), nullptr); v->setProperty (Ids::name, target.getXcodeSchemeName(), nullptr); v->setProperty ("productName", projectName, nullptr); @@ -2159,35 +2178,6 @@ private: misc.add (v); } - StringArray getTargetDependencies (const XcodeTarget& target) const - { - StringArray dependencies; - - if (project.isAudioPluginProject()) - { - if (target.type == XcodeTarget::StandalonePlugIn) // depends on AUv3 and shared code - { - if (auto* auv3Target = getTargetOfType (XcodeTarget::AudioUnitv3PlugIn)) - dependencies.add (auv3Target->getDependencyID()); - - if (auto* sharedCodeTarget = getTargetOfType (XcodeTarget::SharedCodeTarget)) - dependencies.add (sharedCodeTarget->getDependencyID()); - } - else if (target.type == XcodeTarget::AggregateTarget) // depends on all other targets - { - for (int i = 1; i < targets.size(); ++i) - dependencies.add (targets[i]->getDependencyID()); - } - else if (target.type != XcodeTarget::SharedCodeTarget) // shared code doesn't depend on anything; all other targets depend only on the shared code - { - if (auto* sharedCodeTarget = getTargetOfType (XcodeTarget::SharedCodeTarget)) - dependencies.add (sharedCodeTarget->getDependencyID()); - } - } - - return dependencies; - } - void createIconFile() const { const auto icons = getIcons(); @@ -2588,6 +2578,7 @@ private: objects.addArray (pbxBuildFiles); objects.addArray (pbxFileReferences); objects.addArray (pbxGroups); + objects.addArray (pbxTargetDependencies); objects.addArray (targetConfigs); objects.addArray (projectConfigs); objects.addArray (misc);