Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Unified Diff: tools/gn/xcode_writer.cc

Issue 2574643002: Add functionality to find xctest files under application target. (Closed)
Patch Set: Addressed feedback Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/xcode_writer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/xcode_writer.cc
diff --git a/tools/gn/xcode_writer.cc b/tools/gn/xcode_writer.cc
index 633a1c8db5ea35b354ff3bfb5297aa3c1628dae4..54ba8f8458ad56e7117a6fbf98703b50dd27ab36 100644
--- a/tools/gn/xcode_writer.cc
+++ b/tools/gn/xcode_writer.cc
@@ -31,6 +31,10 @@
namespace {
+using TargetToFileList = std::unordered_map<const Target*, Target::FileList>;
+
+const char kEarlGreyFileNameIdentifier[] = "egtest.mm";
+
justincohen 2016/12/15 00:30:24 Is there a better, less sticky way of finding Xcte
struct SafeEnvironmentVariableInfo {
const char* name;
bool capture_at_generation;
@@ -86,6 +90,60 @@ std::string GetBuildScript(const std::string& target_name,
return script.str();
}
+// Finds the list of earl grey files recursively under |target|.
+void GetEarlGreyFiles(const Target* target,
+ TargetToFileList* eg_files_per_target) {
+ // Early return if already visited and processed.
+ if (eg_files_per_target->find(target) != eg_files_per_target->end())
+ return;
+
+ Target::FileList eg_files;
+ for (const SourceFile& file : target->sources()) {
+ if (base::EndsWith(file.GetName(), kEarlGreyFileNameIdentifier,
+ base::CompareCase::SENSITIVE)) {
+ eg_files.push_back(file);
+ }
+ }
+
+ // Call recursively on public and private deps.
+ for (const auto& target : target->public_deps()) {
+ GetEarlGreyFiles(target.ptr, eg_files_per_target);
+ const Target::FileList& deps_eg_files = (*eg_files_per_target)[target.ptr];
+ eg_files.insert(eg_files.end(), deps_eg_files.begin(), deps_eg_files.end());
+ }
+
+ for (const auto& target : target->private_deps()) {
+ GetEarlGreyFiles(target.ptr, eg_files_per_target);
+ const Target::FileList& deps_eg_files = (*eg_files_per_target)[target.ptr];
+ eg_files.insert(eg_files.end(), deps_eg_files.begin(), deps_eg_files.end());
+ }
+
+ // Sort eg_files to remove duplicates.
+ std::sort(eg_files.begin(), eg_files.end());
+ eg_files.erase(std::unique(eg_files.begin(), eg_files.end()), eg_files.end());
+
+ eg_files_per_target->insert(std::make_pair(target, eg_files));
+}
+
+// Finds the list of earl grey files recursively under each of the application
+// target.
+void GetEarlGreyFilesForAll(
+ const std::vector<const Target*>& application_targets,
+ std::vector<Target::FileList>* file_lists) {
+ TargetToFileList eg_files_per_target;
+
+ for (const Target* target : application_targets) {
+ GetEarlGreyFiles(target, &eg_files_per_target);
+ file_lists->push_back(eg_files_per_target[target]);
+ }
+}
+
+bool IsApplicationTarget(const Target* target) {
+ return target->output_type() == Target::CREATE_BUNDLE &&
+ target->bundle_data().product_type() ==
+ "com.apple.product-type.application";
+}
+
class CollectPBXObjectsPerClassHelper : public PBXObjectVisitor {
public:
CollectPBXObjectsPerClassHelper() {}
@@ -266,6 +324,20 @@ bool XcodeWriter::FilterTargets(const BuildSettings* build_settings,
return true;
}
+// static
+void XcodeWriter::FilterApplicationTargets(
+ const std::vector<const Target*>& targets,
+ std::vector<const Target*>* application_targets) {
+ // Filter out all targets of type CREATE_BUNDLE and whose bundle_data has
+ // product_type: "com.apple.product-type.application".
+ for (const Target* target : targets) {
+ if (!IsApplicationTarget(target))
+ continue;
+
+ application_targets->push_back(target);
+ }
+}
+
void XcodeWriter::CreateProductsProject(
const std::vector<const Target*>& targets,
const PBXAttributes& attributes,
@@ -278,6 +350,14 @@ void XcodeWriter::CreateProductsProject(
std::unique_ptr<PBXProject> main_project(
new PBXProject("products", config_name, source_path, attributes));
+ // Filter application targets and find list of earl grey test files
+ // recursively under them.
+ std::vector<const Target*> xctest_targets;
+ std::vector<const Target*> application_targets;
+ std::vector<Target::FileList> earl_grey_file_lists;
+ XcodeWriter::FilterApplicationTargets(targets, &application_targets);
+ GetEarlGreyFilesForAll(application_targets, &earl_grey_file_lists);
+
std::string build_path;
std::unique_ptr<base::Environment> env(base::Environment::Create());
« no previous file with comments | « tools/gn/xcode_writer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698