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)#ifndef TOOLS_GN_NINJA_SCRIPT_TARGET_WRITER_H_ 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define TOOLS_GN_NINJA_SCRIPT_TARGET_WRITER_H_ 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <vector> 9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/compiler_specific.h" 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/gtest_prod_util.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "tools/gn/ninja_target_writer.h" 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class FileTemplate; 15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class OutputFile; 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Writes a .ninja file for a custom script target type. 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class NinjaScriptTargetWriter : public NinjaTargetWriter { 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NinjaScriptTargetWriter(const Target* target, 210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const Toolchain* toolchain, 220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) std::ostream& out); 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~NinjaScriptTargetWriter(); 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void Run() OVERRIDE; 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(NinjaScriptTargetWriter, 29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) WriteOutputFilesForBuildLine); 30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(NinjaScriptTargetWriter, 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WriteOutputFilesForBuildLineWithDepfile); 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(NinjaScriptTargetWriter, 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) WriteArgsSubstitutions); 34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool has_sources() const { return !target_->sources().empty(); } 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Writes the Ninja rule for invoking the script. 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Returns the name of the custom rule generated. This will be based on the 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // target name, and will include the string "$unique_name" if there are 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // multiple inputs. 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string WriteRuleDefinition(const FileTemplate& args_template); 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Writes the rules for compiling each source, writing all output files 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // to the given vector. 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // implicit_deps is a precomputed string of all ninja files that are common 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // to each build step, it starts with a "|" if it's nonempty. 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void WriteSourceRules(const std::string& custom_rule_name, 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& implicit_deps, 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const FileTemplate& args_template, 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::vector<OutputFile>* output_files); 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Writes the Ninja variables that expand the substitutions required by the 55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // arguments for the given source file. 56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void WriteArgsSubstitutions(const SourceFile& source, 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const FileTemplate& args_template); 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Writes the .stamp rule that names this target and collects all invocations 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // of the script into one thing that other targets can depend on. 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void WriteStamp(const std::vector<OutputFile>& output_files); 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Writes the output files generated by the output template for the given 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // source file. This will start with a space and will not include a newline. 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Appends the output files to the given vector. 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void WriteOutputFilesForBuildLine(const FileTemplate& output_template, 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const SourceFile& source, 68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<OutputFile>* output_files); 69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void WriteDepfile(const SourceFile& source); 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns the FileTemplate for the depfile variable. 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FileTemplate GetDepfileTemplate() const; 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Path output writer that doesn't do any escaping or quoting. It does, 76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // however, convert slashes. Used for 77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // computing intermediate strings. 78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PathOutput path_output_no_escaping_; 79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NinjaScriptTargetWriter); 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif // TOOLS_GN_NINJA_SCRIPT_TARGET_WRITER_H_ 84