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