13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "tools/gn/ninja_copy_target_writer.h"
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/strings/string_util.h"
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "tools/gn/file_template.h"
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "tools/gn/string_utils.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)NinjaCopyTargetWriter::NinjaCopyTargetWriter(const Target* target,
120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                             const Toolchain* toolchain,
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                             std::ostream& out)
140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    : NinjaTargetWriter(target, toolchain, out) {
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)NinjaCopyTargetWriter::~NinjaCopyTargetWriter() {
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void NinjaCopyTargetWriter::Run() {
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  CHECK(target_->script_values().outputs().size() == 1);
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  FileTemplate output_template(GetOutputTemplate());
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::vector<OutputFile> output_files;
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  std::string rule_prefix = helper_.GetRulePrefix(target_->settings());
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (size_t i = 0; i < target_->sources().size(); i++) {
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const SourceFile& input_file = target_->sources()[i];
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // Make the output file from the template.
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    std::vector<std::string> template_result;
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    output_template.ApplyString(input_file.value(), &template_result);
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    CHECK(template_result.size() == 1);
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    OutputFile output_file(template_result[0]);
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    output_files.push_back(output_file);
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    out_ << "build ";
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    path_output_.WriteFile(out_, output_file);
4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    out_ << ": " << rule_prefix << "copy ";
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    path_output_.WriteFile(out_, input_file);
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    out_ << std::endl;
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Write out the rule for the target to copy all of them.
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  out_ << std::endl << "build ";
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  path_output_.WriteFile(out_, helper_.GetTargetOutputFile(target_));
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  out_ << ": " << rule_prefix << "stamp";
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (size_t i = 0; i < output_files.size(); i++) {
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    out_ << " ";
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    path_output_.WriteFile(out_, output_files[i]);
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  out_ << std::endl;
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
56