Chromium Code Reviews| 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()); |