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

Side by Side Diff: tools/gn/function_get_target_outputs.cc

Issue 429423002: Refactor GN source expansions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Clang warning Created 6 years, 4 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "tools/gn/build_settings.h" 5 #include "tools/gn/build_settings.h"
6 #include "tools/gn/file_template.h"
7 #include "tools/gn/functions.h" 6 #include "tools/gn/functions.h"
8 #include "tools/gn/ninja_helper.h" 7 #include "tools/gn/ninja_helper.h"
9 #include "tools/gn/parse_tree.h" 8 #include "tools/gn/parse_tree.h"
10 #include "tools/gn/settings.h" 9 #include "tools/gn/settings.h"
10 #include "tools/gn/substitution_writer.h"
11 #include "tools/gn/target.h" 11 #include "tools/gn/target.h"
12 #include "tools/gn/value.h" 12 #include "tools/gn/value.h"
13 13
14 namespace functions { 14 namespace functions {
15 15
16 namespace { 16 namespace {
17 17
18 void GetOutputsForTarget(const Settings* settings, 18 void GetOutputsForTarget(const Settings* settings,
19 const Target* target, 19 const Target* target,
20 std::vector<std::string>* ret) { 20 std::vector<SourceFile>* ret) {
21 switch (target->output_type()) { 21 switch (target->output_type()) {
22 case Target::ACTION: { 22 case Target::ACTION: {
23 // Actions: return the outputs specified. 23 // Actions just use the output list with no substitution. To keep things
24 const std::vector<std::string>& outs = target->action_values().outputs(); 24 // simple, pass an empty "source file" in to use the same code path for
25 ret->reserve(outs.size()); 25 // computing substitution outputs.
26 for (size_t i = 0; i < outs.size(); i++) 26 std::vector<SourceFile> sources;
27 ret->push_back(outs[i]); 27 sources.push_back(SourceFile());
28 SubstitutionWriter::ApplyListToSources(
29 settings, target->action_values().outputs(), sources, ret);
scottmg 2014/08/05 22:30:32 What will happen if there is a substitution? Maybe
brettw 2014/08/06 18:25:01 The thing that makes the target should prohibit th
28 break; 30 break;
29 } 31 }
30 32
31 case Target::COPY_FILES: 33 case Target::COPY_FILES:
32 case Target::ACTION_FOREACH: { 34 case Target::ACTION_FOREACH:
33 // Copy/action_foreach: return the result of the template in the outputs. 35 SubstitutionWriter::ApplyListToSources(
34 FileTemplate file_template(settings, target->action_values().outputs(), 36 settings, target->action_values().outputs(), target->sources(), ret);
35 FileTemplate::OUTPUT_ABSOLUTE, SourceDir());
36 const std::vector<SourceFile>& sources = target->sources();
37 for (size_t i = 0; i < sources.size(); i++)
38 file_template.Apply(sources[i], ret);
39 break; 37 break;
40 }
41 38
42 case Target::EXECUTABLE: 39 case Target::EXECUTABLE:
43 case Target::SHARED_LIBRARY: 40 case Target::SHARED_LIBRARY:
44 case Target::STATIC_LIBRARY: 41 case Target::STATIC_LIBRARY:
45 // Return the resulting binary file. Currently, fall through to the 42 // Return the resulting binary file. Currently, fall through to the
46 // Ninja helper below which will compute the main output name. 43 // Ninja helper below which will compute the main output name.
47 // 44 //
48 // TODO(brettw) some targets have secondary files which should go into 45 // TODO(brettw) some targets have secondary files which should go into
49 // the list after the main (like shared libraries on Windows have an 46 // the list after the main (like shared libraries on Windows have an
50 // import library). 47 // import library).
51 case Target::GROUP: 48 case Target::GROUP:
52 case Target::SOURCE_SET: { 49 case Target::SOURCE_SET: {
53 // These return the stamp file, which is computed by the NinjaHelper. 50 // These return the stamp file, which is computed by the NinjaHelper.
54 NinjaHelper helper(settings->build_settings()); 51 NinjaHelper helper(settings->build_settings());
55 OutputFile output_file = helper.GetTargetOutputFile(target); 52 OutputFile output_file = helper.GetTargetOutputFile(target);
56 53
57 // The output file is relative to the build dir. 54 // The output file is relative to the build dir.
58 std::string absolute_output_file = 55 ret->push_back(SourceFile(
59 settings->build_settings()->build_dir().value(); 56 settings->build_settings()->build_dir().value() +
60 absolute_output_file.append(output_file.value()); 57 output_file.value()));
61
62 ret->push_back(absolute_output_file);
63 break; 58 break;
64 } 59 }
65 60
66 default: 61 default:
67 NOTREACHED(); 62 NOTREACHED();
68 } 63 }
69 } 64 }
70 65
71 } // namespace 66 } // namespace
72 67
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 } 157 }
163 158
164 if (!target) { 159 if (!target) {
165 *err = Err(function, "Target not found in this context.", 160 *err = Err(function, "Target not found in this context.",
166 label.GetUserVisibleName(false) + 161 label.GetUserVisibleName(false) +
167 "\nwas not found. get_target_outputs() can only be used for targets\n" 162 "\nwas not found. get_target_outputs() can only be used for targets\n"
168 "previously defined in the current file."); 163 "previously defined in the current file.");
169 return Value(); 164 return Value();
170 } 165 }
171 166
172 std::vector<std::string> files; 167 std::vector<SourceFile> files;
173 GetOutputsForTarget(scope->settings(), target, &files); 168 GetOutputsForTarget(scope->settings(), target, &files);
174 169
175 Value ret(function, Value::LIST); 170 Value ret(function, Value::LIST);
176 ret.list_value().reserve(files.size()); 171 ret.list_value().reserve(files.size());
177 for (size_t i = 0; i < files.size(); i++) 172 for (size_t i = 0; i < files.size(); i++)
178 ret.list_value().push_back(Value(function, files[i])); 173 ret.list_value().push_back(Value(function, files[i].value()));
179 174
180 return ret; 175 return ret;
181 } 176 }
182 177
183 } // namespace functions 178 } // namespace functions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698