Include more files in the generated Xcode project
Update Xcode generated project to include more files
- root dotfile, script run via "exec_script",
- BUILD.gn and *.gni defining the targets, configs and toolchains,
- script of "action" and "action_foreach" targets,
- non-sources "inputs" of all targets.
Bug: 152
Change-Id: Ie34c8f7d06634b829f2919f6bd875e436ef547df
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/7561
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/src/gn/xcode_writer.cc b/src/gn/xcode_writer.cc
index ba33de1..9dda504 100644
--- a/src/gn/xcode_writer.cc
+++ b/src/gn/xcode_writer.cc
@@ -25,6 +25,9 @@
#include "gn/commands.h"
#include "gn/deps_iterator.h"
#include "gn/filesystem_utils.h"
+#include "gn/item.h"
+#include "gn/loader.h"
+#include "gn/scheduler.h"
#include "gn/settings.h"
#include "gn/source_file.h"
#include "gn/target.h"
@@ -430,6 +433,9 @@
// Generates the content of the .xcodeproj file into |out|.
void WriteFileContent(std::ostream& out) const;
+ // Returns whether the file should be added to the project.
+ bool ShouldIncludeFileInProject(const SourceFile& source) const;
+
const BuildSettings* build_settings_;
XcodeWriter::Options options_;
PBXProject project_;
@@ -447,32 +453,74 @@
XcodeProject::~XcodeProject() = default;
+bool XcodeProject::ShouldIncludeFileInProject(const SourceFile& source) const {
+ if (IsStringInOutputDir(build_settings_->build_dir(), source.value()))
+ return false;
+
+ if (IsPathAbsolute(source.value()))
+ return false;
+
+ return true;
+}
+
bool XcodeProject::AddSourcesFromBuilder(const Builder& builder, Err* err) {
SourceFileSet sources;
// Add sources from all targets.
for (const Target* target : builder.GetAllResolvedTargets()) {
for (const SourceFile& source : target->sources()) {
- if (IsStringInOutputDir(build_settings_->build_dir(), source.value()))
- continue;
+ if (ShouldIncludeFileInProject(source))
+ sources.insert(source);
+ }
- if (IsPathAbsolute(source.value()))
- continue;
-
- sources.insert(source);
+ for (const SourceFile& source : target->config_values().inputs()) {
+ if (ShouldIncludeFileInProject(source))
+ sources.insert(source);
}
for (const SourceFile& source : target->public_headers()) {
- if (IsStringInOutputDir(build_settings_->build_dir(), source.value()))
- continue;
+ if (ShouldIncludeFileInProject(source))
+ sources.insert(source);
+ }
- if (IsPathAbsolute(source.value()))
- continue;
-
- sources.insert(source);
+ if (target->output_type() == Target::ACTION ||
+ target->output_type() == Target::ACTION_FOREACH) {
+ if (ShouldIncludeFileInProject(target->action_values().script()))
+ sources.insert(target->action_values().script());
}
}
+ // Add BUILD.gn and *.gni for targets, configs and toolchains.
+ for (const Item* item : builder.GetAllResolvedItems()) {
+ if (!item->AsConfig() && !item->AsTarget() && !item->AsToolchain())
+ continue;
+
+ const SourceFile build = Loader::BuildFileForLabel(item->label());
+ if (ShouldIncludeFileInProject(build))
+ sources.insert(build);
+
+ for (const SourceFile& source :
+ item->settings()->import_manager().GetImportedFiles()) {
+ if (ShouldIncludeFileInProject(source))
+ sources.insert(source);
+ }
+ }
+
+ // Add other files read by gn (the main dotfile, exec_script scripts, ...).
+ for (const auto& path : g_scheduler->GetGenDependencies()) {
+ if (!build_settings_->root_path().IsParent(path))
+ continue;
+
+ const std::string as8bit = path.As8Bit();
+ const SourceFile source(
+ "//" + as8bit.substr(build_settings_->root_path().value().size() + 1));
+
+ if (ShouldIncludeFileInProject(source))
+ sources.insert(source);
+ }
+
+ // Sort files to ensure deterministic generation of the project file (and
+ // nicely sorted file list in Xcode).
std::vector<SourceFile> sorted_sources(sources.begin(), sources.end());
std::sort(sorted_sources.begin(), sorted_sources.end());
diff --git a/src/gn/xcode_writer.h b/src/gn/xcode_writer.h
index bf007be..69d4903 100644
--- a/src/gn/xcode_writer.h
+++ b/src/gn/xcode_writer.h
@@ -12,7 +12,6 @@
#include <vector>
#include "base/macros.h"
-#include "gn/xcode_object.h"
class Builder;
class BuildSettings;