1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef TOOLS_GN_NINJA_HELPER_H_ 6#define TOOLS_GN_NINJA_HELPER_H_ 7 8#include <iosfwd> 9#include <string> 10 11#include "tools/gn/filesystem_utils.h" 12#include "tools/gn/output_file.h" 13#include "tools/gn/target.h" 14 15class BuildSettings; 16class SourceDir; 17class SourceFile; 18class Target; 19 20// NinjaHelper ----------------------------------------------------------------- 21 22class NinjaHelper { 23 public: 24 NinjaHelper(const BuildSettings* build_settings); 25 ~NinjaHelper(); 26 27 // Ends in a slash. 28 std::string GetTopleveOutputDir() const; 29 30 // Ends in a slash. 31 OutputFile GetTargetOutputDir(const Target* target) const; 32 33 // Example: "base/base.ninja". The string version will not be escaped, and 34 // will always have slashes for path separators. 35 OutputFile GetNinjaFileForTarget(const Target* target) const; 36 37 // Returns the name of the root .ninja file for the given toolchain. 38 OutputFile GetNinjaFileForToolchain(const Settings* settings) const; 39 40 // Given a source file relative to the source root, returns the output 41 // filename. 42 OutputFile GetOutputFileForSource(const Target* target, 43 const SourceFile& source, 44 SourceFileType type) const; 45 46 // Returns the filename produced by the given output. 47 // 48 // Some targets make multiple files (like a .dll and an import library). This 49 // function returns the name of the file other targets should depend on and 50 // link to (so in this example, the import library). 51 OutputFile GetTargetOutputFile(const Target* target) const; 52 53 // Returns the prefix for rules on the given toolchain. We need this to 54 // disambiguate a given rule for each toolchain. 55 std::string GetRulePrefix(const Settings* settings) const; 56 57 // Returns the name of the rule name for the given toolchain and file/target 58 // type. Returns the empty string for source files with no command. 59 std::string GetRuleForSourceType(const Settings* settings, 60 SourceFileType type) const; 61 62 // Returns the relative directory in either slashes or the system separator 63 // from the ninja directory (e.g. "out/Debug") to the source root (e.g. 64 // "../.."). It has no terminating slash. 65 const std::string& build_to_src_no_last_slash() const { 66 return build_to_src_no_last_slash_; 67 } 68 const std::string& build_to_src_system_no_last_slash() const { 69 return build_to_src_system_no_last_slash_; 70 } 71 72 private: 73 const BuildSettings* build_settings_; 74 75 std::string build_to_src_no_last_slash_; 76 std::string build_to_src_system_no_last_slash_; 77 78 DISALLOW_COPY_AND_ASSIGN(NinjaHelper); 79}; 80 81#endif // TOOLS_GN_NINJA_HELPER_H_ 82