// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef TOOLS_GN_NINJA_TARGET_COMMAND_WRITER_H_ #define TOOLS_GN_NINJA_TARGET_COMMAND_WRITER_H_ #include "base/json/string_escape.h" #include "tools/gn/config_values_extractors.h" #include "tools/gn/escape.h" #include "tools/gn/filesystem_utils.h" #include "tools/gn/path_output.h" #include "tools/gn/target.h" #include "tools/gn/toolchain.h" struct DefineWriter { DefineWriter() { options.mode = ESCAPE_NINJA_COMMAND; } DefineWriter(EscapingMode mode, bool escape_strings) : escape_strings(escape_strings) { options.mode = mode; } void operator()(const std::string& s, std::ostream& out) const { out << " "; if (escape_strings) { std::string dest; base::EscapeJSONString(s, false, &dest); EscapeStringToStream(out, "-D" + dest, options); return; } EscapeStringToStream(out, "-D" + s, options); } EscapeOptions options; bool escape_strings = false; }; struct IncludeWriter { explicit IncludeWriter(PathOutput& path_output) : path_output_(path_output) {} ~IncludeWriter() = default; void operator()(const SourceDir& d, std::ostream& out) const { std::ostringstream path_out; path_output_.WriteDir(path_out, d, PathOutput::DIR_NO_LAST_SLASH); const std::string& path = path_out.str(); if (path[0] == '"') out << " \"-I" << path.substr(1); else out << " -I" << path; } PathOutput& path_output_; }; // has_precompiled_headers is set when this substitution matches a tool type // that supports precompiled headers, and this target supports precompiled // headers. It doesn't indicate if the tool has precompiled headers (this // will be looked up by this function). // // The tool_type indicates the corresponding tool for flags that are // tool-specific (e.g. "cflags_c"). For non-tool-specific flags (e.g. // "defines") tool_type should be TYPE_NONE. void WriteOneFlag(const Target* target, SubstitutionType subst_enum, bool has_precompiled_headers, Toolchain::ToolType tool_type, const std::vector& (ConfigValues::*getter)() const, EscapeOptions flag_escape_options, PathOutput& path_output, std::ostream& out, bool write_substitution = true); // Fills |outputs| with the object or gch file for the precompiled header of the // given type (flag type and tool type must match). void GetPCHOutputFiles(const Target* target, Toolchain::ToolType tool_type, std::vector* outputs); std::string GetGCCPCHOutputExtension(Toolchain::ToolType tool_type); std::string GetWindowsPCHObjectExtension(Toolchain::ToolType tool_type, const std::string& obj_extension); #endif // TOOLS_GN_NINJA_TARGET_COMMAND_WRITER_H_