| Index: tools/gn/command_gyp.cc
|
| diff --git a/tools/gn/command_gyp.cc b/tools/gn/command_gyp.cc
|
| index 0aff1a92ee241cb4b30ca765ce05510ef6b4c753..06e5bde410a6208168525c7c2be3e6c995968a8b 100644
|
| --- a/tools/gn/command_gyp.cc
|
| +++ b/tools/gn/command_gyp.cc
|
| @@ -16,7 +16,6 @@
|
| #include "tools/gn/err.h"
|
| #include "tools/gn/gyp_helper.h"
|
| #include "tools/gn/gyp_target_writer.h"
|
| -#include "tools/gn/item_node.h"
|
| #include "tools/gn/location.h"
|
| #include "tools/gn/setup.h"
|
| #include "tools/gn/source_file.h"
|
| @@ -32,17 +31,31 @@ typedef std::map<Label, TargetGroup> CorrelatedTargetsMap;
|
| typedef std::map<SourceFile, std::vector<TargetGroup> > GroupedTargetsMap;
|
| typedef std::map<std::string, std::string> StringStringMap;
|
|
|
| +std::vector<const BuilderRecord*> GetAllResolvedTargetRecords(
|
| + const Builder* builder) {
|
| + std::vector<const BuilderRecord*> all = builder->GetAllRecords();
|
| + std::vector<const BuilderRecord*> result;
|
| + result.reserve(all.size());
|
| + for (size_t i = 0; i < all.size(); i++) {
|
| + if (all[i]->type() == BuilderRecord::ITEM_TARGET &&
|
| + all[i]->should_generate() &&
|
| + all[i]->item())
|
| + result.push_back(all[i]);
|
| + }
|
| + return result;
|
| +}
|
| +
|
| // Groups targets sharing the same label between debug and release.
|
| -void CorrelateTargets(const std::vector<const Target*>& debug_targets,
|
| - const std::vector<const Target*>& release_targets,
|
| +void CorrelateTargets(const std::vector<const BuilderRecord*>& debug_targets,
|
| + const std::vector<const BuilderRecord*>& release_targets,
|
| CorrelatedTargetsMap* correlated) {
|
| for (size_t i = 0; i < debug_targets.size(); i++) {
|
| - const Target* target = debug_targets[i];
|
| - (*correlated)[target->label()].debug = target;
|
| + const BuilderRecord* record = debug_targets[i];
|
| + (*correlated)[record->label()].debug = record;
|
| }
|
| for (size_t i = 0; i < release_targets.size(); i++) {
|
| - const Target* target = release_targets[i];
|
| - (*correlated)[target->label()].release = target;
|
| + const BuilderRecord* record = release_targets[i];
|
| + (*correlated)[record->label()].release = record;
|
| }
|
| }
|
|
|
| @@ -51,18 +64,21 @@ void CorrelateTargets(const std::vector<const Target*>& debug_targets,
|
| bool EnsureTargetsMatch(const TargetGroup& group, Err* err) {
|
| // Check that both debug and release made this target.
|
| if (!group.debug || !group.release) {
|
| - const Target* non_null_one = group.debug ? group.debug : group.release;
|
| + const BuilderRecord* non_null_one =
|
| + group.debug ? group.debug : group.release;
|
| *err = Err(Location(), "The debug and release builds did not both generate "
|
| "a target with the name\n" +
|
| non_null_one->label().GetUserVisibleName(true));
|
| return false;
|
| }
|
|
|
| + const Target* debug_target = group.debug->item()->AsTarget();
|
| + const Target* release_target = group.release->item()->AsTarget();
|
| +
|
| // Check the flags that determine if and where we write the GYP file.
|
| - if (group.debug->item_node()->should_generate() !=
|
| - group.release->item_node()->should_generate() ||
|
| - group.debug->external() != group.release->external() ||
|
| - group.debug->gyp_file() != group.release->gyp_file()) {
|
| + if (group.debug->should_generate() != group.release->should_generate() ||
|
| + debug_target->external() != release_target->external() ||
|
| + debug_target->gyp_file() != release_target->gyp_file()) {
|
| *err = Err(Location(), "The metadata for the target\n" +
|
| group.debug->label().GetUserVisibleName(true) +
|
| "\ndoesn't match between the debug and release builds.");
|
| @@ -70,41 +86,40 @@ bool EnsureTargetsMatch(const TargetGroup& group, Err* err) {
|
| }
|
|
|
| // Check that the sources match.
|
| - if (group.debug->sources().size() != group.release->sources().size()) {
|
| + if (debug_target->sources().size() != release_target->sources().size()) {
|
| *err = Err(Location(), "The source file count for the target\n" +
|
| group.debug->label().GetUserVisibleName(true) +
|
| "\ndoesn't have the same number of files between the debug and "
|
| "release builds.");
|
| return false;
|
| }
|
| - for (size_t i = 0; i < group.debug->sources().size(); i++) {
|
| - if (group.debug->sources()[i] != group.release->sources()[i]) {
|
| + for (size_t i = 0; i < debug_target->sources().size(); i++) {
|
| + if (debug_target->sources()[i] != release_target->sources()[i]) {
|
| *err = Err(Location(), "The debug and release version of the target \n" +
|
| group.debug->label().GetUserVisibleName(true) +
|
| "\ndon't agree on the file\n" +
|
| - group.debug->sources()[i].value());
|
| + debug_target->sources()[i].value());
|
| return false;
|
| }
|
| }
|
|
|
| // Check that the deps match.
|
| - if (group.debug->deps().size() != group.release->deps().size()) {
|
| + if (debug_target->deps().size() != release_target->deps().size()) {
|
| *err = Err(Location(), "The source file count for the target\n" +
|
| group.debug->label().GetUserVisibleName(true) +
|
| "\ndoesn't have the same number of deps between the debug and "
|
| "release builds.");
|
| return false;
|
| }
|
| - for (size_t i = 0; i < group.debug->deps().size(); i++) {
|
| - if (group.debug->deps()[i].label != group.release->deps()[i].label) {
|
| + for (size_t i = 0; i < debug_target->deps().size(); i++) {
|
| + if (debug_target->deps()[i].label != release_target->deps()[i].label) {
|
| *err = Err(Location(), "The debug and release version of the target \n" +
|
| group.debug->label().GetUserVisibleName(true) +
|
| "\ndon't agree on the dep\n" +
|
| - group.debug->deps()[i].label.GetUserVisibleName(true));
|
| + debug_target->deps()[i].label.GetUserVisibleName(true));
|
| return false;
|
| }
|
| }
|
| -
|
| return true;
|
| }
|
|
|
| @@ -212,16 +227,15 @@ Scope::KeyValueMap GetArgsFromGypDefines() {
|
| return result;
|
| }
|
|
|
| -// Returns the number of targets, number of GYP files.
|
| -std::pair<int, int> WriteGypFiles(
|
| - const BuildSettings& debug_settings,
|
| - const BuildSettings& release_settings,
|
| - Err* err) {
|
| +// Returns the (number of targets, number of GYP files).
|
| +std::pair<int, int> WriteGypFiles(CommonSetup* debug_setup,
|
| + CommonSetup* release_setup,
|
| + Err* err) {
|
| // Group all targets by output GYP file name.
|
| - std::vector<const Target*> debug_targets;
|
| - std::vector<const Target*> release_targets;
|
| - debug_settings.target_manager().GetAllTargets(&debug_targets);
|
| - release_settings.target_manager().GetAllTargets(&release_targets);
|
| + std::vector<const BuilderRecord*> debug_targets =
|
| + GetAllResolvedTargetRecords(debug_setup->builder());
|
| + std::vector<const BuilderRecord*> release_targets =
|
| + GetAllResolvedTargetRecords(release_setup->builder());
|
|
|
| // Match up the debug and release version of each target by label.
|
| CorrelatedTargetsMap correlated;
|
| @@ -233,19 +247,20 @@ std::pair<int, int> WriteGypFiles(
|
| for (CorrelatedTargetsMap::iterator i = correlated.begin();
|
| i != correlated.end(); ++i) {
|
| const TargetGroup& group = i->second;
|
| - if (!group.debug->item_node()->should_generate())
|
| + if (!group.debug->should_generate())
|
| continue; // Skip non-generated ones.
|
| - if (group.debug->external())
|
| + if (group.debug->item()->AsTarget()->external())
|
| continue; // Skip external ones.
|
| - if (group.debug->gyp_file().is_null())
|
| + if (group.debug->item()->AsTarget()->gyp_file().is_null())
|
| continue; // Skip ones without GYP files.
|
|
|
| if (!EnsureTargetsMatch(group, err))
|
| return std::make_pair(0, 0);
|
|
|
| target_count++;
|
| - grouped_targets[helper.GetGypFileForTarget(group.debug, err)].push_back(
|
| - group);
|
| + grouped_targets[
|
| + helper.GetGypFileForTarget(group.debug->item()->AsTarget(), err)]
|
| + .push_back(group);
|
| if (err->has_error())
|
| return std::make_pair(0, 0);
|
| }
|
| @@ -358,9 +373,7 @@ int RunGyp(const std::vector<std::string>& args) {
|
| return 1;
|
|
|
| Err err;
|
| - std::pair<int, int> counts = WriteGypFiles(setup_debug->build_settings(),
|
| - setup_release->build_settings(),
|
| - &err);
|
| + std::pair<int, int> counts = WriteGypFiles(setup_debug, setup_release, &err);
|
| if (err.has_error()) {
|
| err.PrintToStdout();
|
| return 1;
|
|
|