Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Unified Diff: tools/gn/gyp_binary_target_writer.cc

Issue 206813002: Remove GN GYP generator. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/gyp_binary_target_writer.h ('k') | tools/gn/gyp_binary_target_writer_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/gyp_binary_target_writer.cc
diff --git a/tools/gn/gyp_binary_target_writer.cc b/tools/gn/gyp_binary_target_writer.cc
deleted file mode 100644
index ca0f340f84b75c3c5889e80fb95e3185982ba5ed..0000000000000000000000000000000000000000
--- a/tools/gn/gyp_binary_target_writer.cc
+++ /dev/null
@@ -1,773 +0,0 @@
-// Copyright (c) 2013 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.
-
-#include "tools/gn/gyp_binary_target_writer.h"
-
-#include <set>
-
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-#include "tools/gn/builder_record.h"
-#include "tools/gn/config_values_extractors.h"
-#include "tools/gn/err.h"
-#include "tools/gn/escape.h"
-#include "tools/gn/filesystem_utils.h"
-#include "tools/gn/settings.h"
-#include "tools/gn/target.h"
-
-namespace {
-
-// This functor is used to capture the output of RecursiveTargetConfigToStream
-// in an vector.
-template<typename T>
-struct Accumulator {
- Accumulator(std::vector<T>* result_in) : result(result_in) {}
-
- void operator()(const T& s, std::ostream&) const {
- result->push_back(s);
- }
-
- std::vector<T>* result;
-};
-
-// Writes the given array values. The array should already be declared with the
-// opening "[" written to the output. The function will not write the
-// terminating "]" either.
-void WriteArrayValues(std::ostream& out,
- const std::vector<std::string>& values) {
- EscapeOptions options;
- options.mode = ESCAPE_JSON;
- for (size_t i = 0; i < values.size(); i++) {
- out << " '";
- EscapeStringToStream(out, values[i], options);
- out << "',";
- }
-}
-
-// Returns the value from the already-filled in cflags_* for the optimization
-// level to set in the GYP file. Additionally, this removes the flag from the
-// given vector so we don't get duplicates.
-std::string GetVCOptimization(std::vector<std::string>* cflags) {
- // Searches for the "/O?" option and returns the corresponding GYP value.
- for (size_t i = 0; i < cflags->size(); i++) {
- const std::string& cur = (*cflags)[i];
- if (cur.size() == 3 && cur[0] == '/' && cur[1] == 'O') {
- char level = cur[2];
- cflags->erase(cflags->begin() + i); // Invalidates |cur|!
- switch (level) {
- case 'd': return "'0'";
- case '1': return "'1'";
- case '2': return "'2'";
- case 'x': return "'3'";
- default: return "'2'";
- }
- }
- }
- return "'2'"; // Default value.
-}
-
-// Returns the value from the already-filled in cflags for the processor
-// architecture to set in the GYP file. Additionally, this removes the flag
-// from the given vector so we don't get duplicates.
-std::string GetMacArch(std::vector<std::string>* cflags) {
- // Searches for the "-arch" option and returns the corresponding GYP value.
- for (size_t i = 0; i < cflags->size(); i++) {
- const std::string& cur = (*cflags)[i];
- if (cur == "-arch") {
- // This is the first part of a list with ["-arch", "i386"], return the
- // following item, and delete both of them.
- if (i < cflags->size() - 1) {
- std::string ret = (*cflags)[i + 1];
- cflags->erase(cflags->begin() + i, cflags->begin() + i + 2);
- return ret;
- }
- } else if (StartsWithASCII(cur, "-arch ", true)) {
- // The arch was passed as one GN string value, e.g. "-arch i386". Return
- // the stuff following the space and delete the item.
- std::string ret = cur.substr(6);
- cflags->erase(cflags->begin() + i);
- return ret;
- }
- }
- return std::string();
-}
-
-// Searches for -miphoneos-version-min, returns the resulting value, and
-// removes it from the list. Returns the empty string if it's not found.
-std::string GetIPhoneVersionMin(std::vector<std::string>* cflags) {
- // Searches for the "-arch" option and returns the corresponding GYP value.
- const char prefix[] = "-miphoneos-version-min=";
- for (size_t i = 0; i < cflags->size(); i++) {
- const std::string& cur = (*cflags)[i];
- if (StartsWithASCII(cur, prefix, true)) {
- std::string result = cur.substr(arraysize(prefix) - 1);
- cflags->erase(cflags->begin() + i);
- return result;
- }
- }
- return std::string();
-}
-
-// Finds all values from the given getter from all configs in the given list,
-// and adds them to the given result vector.
-template<typename T>
-void FillConfigListValues(
- const LabelConfigVector& configs,
- const std::vector<T>& (ConfigValues::* getter)() const,
- std::vector<T>* result) {
- for (size_t config_i = 0; config_i < configs.size(); config_i++) {
- const std::vector<T>& values =
- (configs[config_i].ptr->config_values().*getter)();
- for (size_t val_i = 0; val_i < values.size(); val_i++)
- result->push_back(values[val_i]);
- }
-}
-
-bool IsClang(const Target* target) {
- const Value* is_clang =
- target->settings()->base_config()->GetValue("is_clang");
- return is_clang && is_clang->type() == Value::BOOLEAN &&
- is_clang->boolean_value();
-}
-
-bool IsIOS(const Target* target) {
- const Value* is_ios = target->settings()->base_config()->GetValue("is_ios");
- return is_ios && is_ios->type() == Value::BOOLEAN && is_ios->boolean_value();
-}
-
-// Returns true if the current target is an iOS simulator build.
-bool IsIOSSimulator(const std::vector<std::string>& cflags) {
- // Search for the sysroot flag. We expect one flag to be the
- // switch, and the following one to be the value.
- const char sysroot[] = "-isysroot";
- for (size_t i = 0; i < cflags.size(); i++) {
- const std::string& cur = cflags[i];
- if (cur == sysroot) {
- if (i == cflags.size() - 1)
- return false; // No following value.
-
- // The argument is a file path, we check the prefix of the file name.
- base::FilePath path(UTF8ToFilePath(cflags[i + 1]));
- std::string path_file_part = FilePathToUTF8(path.BaseName());
- return StartsWithASCII(path_file_part, "iphonesimulator", false);
- }
- }
- return false;
-}
-
-} // namespace
-
-GypBinaryTargetWriter::Flags::Flags() {}
-GypBinaryTargetWriter::Flags::~Flags() {}
-
-GypBinaryTargetWriter::GypBinaryTargetWriter(const TargetGroup& group,
- const Toolchain* debug_toolchain,
- const SourceDir& gyp_dir,
- std::ostream& out)
- : GypTargetWriter(group.get()->item()->AsTarget(), debug_toolchain,
- gyp_dir, out),
- group_(group) {
-}
-
-GypBinaryTargetWriter::~GypBinaryTargetWriter() {
-}
-
-void GypBinaryTargetWriter::Run() {
- int indent = 4;
-
- Indent(indent) << "{\n";
-
- WriteName(indent + kExtraIndent);
- WriteType(indent + kExtraIndent);
-
- if (target_->settings()->IsLinux())
- WriteLinuxConfiguration(indent + kExtraIndent);
- else if (target_->settings()->IsWin())
- WriteVCConfiguration(indent + kExtraIndent);
- else if (target_->settings()->IsMac())
- WriteMacConfiguration(indent + kExtraIndent);
- WriteDirectDependentSettings(indent + kExtraIndent);
- WriteAllDependentSettings(indent + kExtraIndent);
-
- Indent(indent) << "},\n";
-}
-
-void GypBinaryTargetWriter::WriteName(int indent) {
- std::string name = helper_.GetNameForTarget(target_);
- Indent(indent) << "'target_name': '" << name << "',\n";
-
- std::string product_name;
- if (target_->output_name().empty())
- product_name = target_->label().name();
- else
- product_name = name;
-
- // TODO(brettw) GN knows not to prefix targets starting with "lib" with
- // another "lib" on Linux, but GYP doesn't. We need to rename applicable
- // targets here.
-
- Indent(indent) << "'product_name': '" << product_name << "',\n";
-
- std::string product_extension = target_->output_extension();
- if (!product_extension.empty())
- Indent(indent) << "'product_extension': '" << product_extension << "',\n";
-}
-
-void GypBinaryTargetWriter::WriteType(int indent) {
- Indent(indent) << "'type': ";
- switch (target_->output_type()) {
- case Target::EXECUTABLE:
- out_ << "'executable',\n";
- break;
- case Target::STATIC_LIBRARY:
- out_ << "'static_library',\n";
- break;
- case Target::SHARED_LIBRARY:
- out_ << "'shared_library',\n";
- break;
- case Target::SOURCE_SET:
- out_ << "'static_library',\n"; // TODO(brettw) fixme.
- break;
- default:
- NOTREACHED();
- }
-
- if (target_->hard_dep())
- Indent(indent) << "'hard_dependency': 1,\n";
-
- // Write out the toolsets depending on whether there is a host build. If no
- // toolset is specified, GYP assumes a target build.
- if (group_.debug && group_.host_debug)
- Indent(indent) << "'toolsets': ['target', 'host'],\n";
- else if (group_.host_debug)
- Indent(indent) << "'toolsets': ['host'],\n";
-}
-
-void GypBinaryTargetWriter::WriteVCConfiguration(int indent) {
- Indent(indent) << "'configurations': {\n";
-
- Indent(indent + kExtraIndent) << "'Debug': {\n";
- Indent(indent + kExtraIndent * 2) <<
- "'msvs_configuration_platform': 'Win32',\n";
- Flags debug_flags(FlagsFromTarget(group_.debug->item()->AsTarget()));
- WriteVCFlags(debug_flags, indent + kExtraIndent * 2);
- Indent(indent + kExtraIndent) << "},\n";
-
- Indent(indent + kExtraIndent) << "'Release': {\n";
- Indent(indent + kExtraIndent * 2) <<
- "'msvs_configuration_platform': 'Win32',\n";
- Flags release_flags(FlagsFromTarget(group_.release->item()->AsTarget()));
- WriteVCFlags(release_flags, indent + kExtraIndent * 2);
- Indent(indent + kExtraIndent) << "},\n";
-
- // Note that we always need Debug_x64 and Release_x64 defined or GYP will get
- // confused, but we ca leave them empty if there's no 64-bit target.
- Indent(indent + kExtraIndent) << "'Debug_x64': {\n";
- if (group_.debug64) {
- Indent(indent + kExtraIndent * 2) <<
- "'msvs_configuration_platform': 'x64',\n";
- Flags flags(FlagsFromTarget(group_.debug64->item()->AsTarget()));
- WriteVCFlags(flags, indent + kExtraIndent * 2);
- }
- Indent(indent + kExtraIndent) << "},\n";
-
- Indent(indent + kExtraIndent) << "'Release_x64': {\n";
- if (group_.release64) {
- Indent(indent + kExtraIndent * 2) <<
- "'msvs_configuration_platform': 'x64',\n";
- Flags flags(FlagsFromTarget(group_.release64->item()->AsTarget()));
- WriteVCFlags(flags, indent + kExtraIndent * 2);
- }
- Indent(indent + kExtraIndent) << "},\n";
-
- Indent(indent) << "},\n";
-
- WriteSources(target_, indent);
- WriteDeps(target_, indent);
-}
-
-void GypBinaryTargetWriter::WriteLinuxConfiguration(int indent) {
- // The Linux stuff works differently. On Linux we support cross-compiles and
- // all ninja generators know to look for target conditions. Other platforms'
- // generators don't all do this, so we can't have the same GYP structure.
- Indent(indent) << "'target_conditions': [\n";
- // The host toolset is configured for the current computer, we will only have
- // this when doing cross-compiles.
- if (group_.host_debug && group_.host_release) {
- Indent(indent + kExtraIndent) << "['_toolset == \"host\"', {\n";
- Indent(indent + kExtraIndent * 2) << "'configurations': {\n";
- Indent(indent + kExtraIndent * 3) << "'Debug': {\n";
- WriteLinuxFlagsForTarget(group_.host_debug->item()->AsTarget(),
- indent + kExtraIndent * 4);
- Indent(indent + kExtraIndent * 3) << "},\n";
- Indent(indent + kExtraIndent * 3) << "'Release': {\n";
- WriteLinuxFlagsForTarget(group_.host_release->item()->AsTarget(),
- indent + kExtraIndent * 4);
- Indent(indent + kExtraIndent * 3) << "},\n";
- Indent(indent + kExtraIndent * 2) << "}\n";
-
- // The sources are per-toolset but shared between debug & release.
- WriteSources(group_.host_debug->item()->AsTarget(),
- indent + kExtraIndent * 2);
-
- Indent(indent + kExtraIndent) << "],\n";
- }
-
- // The target toolset is the "regular" one.
- Indent(indent + kExtraIndent) << "['_toolset == \"target\"', {\n";
- Indent(indent + kExtraIndent * 2) << "'configurations': {\n";
- Indent(indent + kExtraIndent * 3) << "'Debug': {\n";
- WriteLinuxFlagsForTarget(group_.debug->item()->AsTarget(),
- indent + kExtraIndent * 4);
- Indent(indent + kExtraIndent * 3) << "},\n";
- Indent(indent + kExtraIndent * 3) << "'Release': {\n";
- WriteLinuxFlagsForTarget(group_.release->item()->AsTarget(),
- indent + kExtraIndent * 4);
- Indent(indent + kExtraIndent * 3) << "},\n";
- Indent(indent + kExtraIndent * 2) << "},\n";
-
- WriteSources(target_, indent + kExtraIndent * 2);
-
- Indent(indent + kExtraIndent) << "},],\n";
- Indent(indent) << "],\n";
-
- // Deps in GYP can not vary based on the toolset.
- WriteDeps(target_, indent);
-}
-
-void GypBinaryTargetWriter::WriteMacConfiguration(int indent) {
- // The Mac flags are parameterized by the GYP generator (Ninja vs. XCode).
- const char kNinjaGeneratorCondition[] =
- "'conditions': [['\"<(GENERATOR)\"==\"ninja\"', {\n";
- const char kNinjaGeneratorElse[] = "}, {\n";
- const char kNinjaGeneratorEnd[] = "}]],\n";
-
- Indent(indent) << "'configurations': {\n";
-
- // Debug.
- Indent(indent + kExtraIndent) << "'Debug': {\n";
- Indent(indent + kExtraIndent * 2) << kNinjaGeneratorCondition;
- {
- // Ninja generator.
- WriteMacTargetAndHostFlags(group_.debug, group_.host_debug,
- indent + kExtraIndent * 3);
- }
- Indent(indent + kExtraIndent * 2) << kNinjaGeneratorElse;
- if (group_.xcode_debug) {
- // XCode generator.
- WriteMacTargetAndHostFlags(group_.xcode_debug, group_.xcode_host_debug,
- indent + kExtraIndent * 3);
- }
- Indent(indent + kExtraIndent * 2) << kNinjaGeneratorEnd;
- Indent(indent + kExtraIndent) << "},\n";
-
- // Release.
- Indent(indent + kExtraIndent) << "'Release': {\n";
- Indent(indent + kExtraIndent * 2) << kNinjaGeneratorCondition;
- {
- // Ninja generator.
- WriteMacTargetAndHostFlags(group_.release, group_.host_release,
- indent + kExtraIndent * 3);
- }
- Indent(indent + kExtraIndent * 2) << kNinjaGeneratorElse;
- if (group_.xcode_release) {
- // XCode generator.
- WriteMacTargetAndHostFlags(group_.xcode_release, group_.xcode_host_release,
- indent + kExtraIndent * 3);
- }
- Indent(indent + kExtraIndent * 2) << kNinjaGeneratorEnd;
- Indent(indent + kExtraIndent) << "},\n";
-
- Indent(indent) << "},\n";
-
- WriteSources(target_, indent);
- WriteDeps(target_, indent);
-}
-
-void GypBinaryTargetWriter::WriteVCFlags(Flags& flags, int indent) {
- // Defines and includes go outside of the msvs settings.
- WriteNamedArray("defines", flags.defines, indent);
- WriteIncludeDirs(flags, indent);
-
- // C flags.
- Indent(indent) << "'msvs_settings': {\n";
- Indent(indent + kExtraIndent) << "'VCCLCompilerTool': {\n";
-
- // GYP always uses the VC optimization flag to add a /O? on Visual Studio.
- // This can produce duplicate values. So look up the GYP value corresponding
- // to the flags used, and set the same one.
- std::string optimization = GetVCOptimization(&flags.cflags);
- WriteNamedArray("AdditionalOptions", flags.cflags, indent + kExtraIndent * 2);
- // TODO(brettw) cflags_c and cflags_cc!
- Indent(indent + kExtraIndent * 2) << "'Optimization': "
- << optimization << ",\n";
- Indent(indent + kExtraIndent) << "},\n";
-
- // Linker tool stuff.
- Indent(indent + kExtraIndent) << "'VCLinkerTool': {\n";
-
- // ...Library dirs.
- EscapeOptions escape_options;
- escape_options.mode = ESCAPE_JSON;
- if (!flags.lib_dirs.empty()) {
- Indent(indent + kExtraIndent * 2) << "'AdditionalLibraryDirectories': [";
- for (size_t i = 0; i < flags.lib_dirs.size(); i++) {
- out_ << " '";
- EscapeStringToStream(out_,
- helper_.GetDirReference(flags.lib_dirs[i], false),
- escape_options);
- out_ << "',";
- }
- out_ << " ],\n";
- }
-
- // ...Libraries.
- WriteNamedArray("AdditionalDependencies", flags.libs,
- indent + kExtraIndent * 2);
-
- // ...LD flags.
- // TODO(brettw) EnableUAC defaults to on and needs to be set. Also
- // UACExecutionLevel and UACUIAccess depends on that and defaults to 0/false.
- WriteNamedArray("AdditionalOptions", flags.ldflags, 14);
- Indent(indent + kExtraIndent) << "},\n";
- Indent(indent) << "},\n";
-}
-
-void GypBinaryTargetWriter::WriteMacFlags(const Target* target,
- Flags& flags,
- int indent) {
- WriteNamedArray("defines", flags.defines, indent);
- WriteIncludeDirs(flags, indent);
-
- // Libraries and library directories.
- EscapeOptions escape_options;
- escape_options.mode = ESCAPE_JSON;
- if (!flags.lib_dirs.empty()) {
- Indent(indent + kExtraIndent) << "'library_dirs': [";
- for (size_t i = 0; i < flags.lib_dirs.size(); i++) {
- out_ << " '";
- EscapeStringToStream(out_,
- helper_.GetDirReference(flags.lib_dirs[i], false),
- escape_options);
- out_ << "',";
- }
- out_ << " ],\n";
- }
- if (!flags.libs.empty()) {
- Indent(indent) << "'link_settings': {\n";
- Indent(indent + kExtraIndent) << "'libraries': [";
- for (size_t i = 0; i < flags.libs.size(); i++) {
- out_ << " '-l";
- EscapeStringToStream(out_, flags.libs[i], escape_options);
- out_ << "',";
- }
- out_ << " ],\n";
- Indent(indent) << "},\n";
- }
-
- Indent(indent) << "'xcode_settings': {\n";
-
- // Architecture. GYP reads this value and uses it to generate the -arch
- // flag, so we always want to remove it from the cflags (which is a side
- // effect of what GetMacArch does), even in cases where we don't use the
- // value (in the iOS arm below).
- std::string arch = GetMacArch(&flags.cflags);
- if (IsIOS(target)) {
- // When writing an iOS "target" (not host) target, we set VALID_ARCHS
- // instead of ARCHS and always use this hardcoded value. This matches the
- // GYP build.
- Indent(indent + kExtraIndent) << "'VALID_ARCHS': ['armv7', 'i386'],\n";
-
- // Tell XCode to target both iPhone and iPad. GN has no such concept.
- Indent(indent + kExtraIndent) << "'TARGETED_DEVICE_FAMILY': '1,2',\n";
-
- if (IsIOSSimulator(flags.cflags)) {
- Indent(indent + kExtraIndent) << "'SDKROOT': 'iphonesimulator',\n";
- } else {
- Indent(indent + kExtraIndent) << "'SDKROOT': 'iphoneos',\n";
- std::string min_ver = GetIPhoneVersionMin(&flags.cflags);
- if (!min_ver.empty()) {
- Indent(indent + kExtraIndent) << "'IPHONEOS_DEPLOYMENT_TARGET': '"
- << min_ver << "',\n";
- }
- }
- } else {
- // When doing regular Mac and "host" iOS (which look like regular Mac)
- // builds, we can set the ARCHS value to what's specified in the build.
- if (arch == "i386")
- Indent(indent + kExtraIndent) << "'ARCHS': [ 'i386' ],\n";
- else if (arch == "x86_64")
- Indent(indent + kExtraIndent) << "'ARCHS': [ 'x86_64' ],\n";
- }
-
- // C/C++ flags.
- if (!flags.cflags.empty() || !flags.cflags_c.empty() ||
- !flags.cflags_objc.empty()) {
- Indent(indent + kExtraIndent) << "'OTHER_CFLAGS': [";
- WriteArrayValues(out_, flags.cflags);
- WriteArrayValues(out_, flags.cflags_c);
- WriteArrayValues(out_, flags.cflags_objc);
- out_ << " ],\n";
- }
- if (!flags.cflags.empty() || !flags.cflags_cc.empty() ||
- !flags.cflags_objcc.empty()) {
- Indent(indent + kExtraIndent) << "'OTHER_CPLUSPLUSFLAGS': [";
- WriteArrayValues(out_, flags.cflags);
- WriteArrayValues(out_, flags.cflags_cc);
- WriteArrayValues(out_, flags.cflags_objcc);
- out_ << " ],\n";
- }
-
- // Ld flags. Don't write these for static libraries. Otherwise, they'll be
- // passed to the library tool which doesn't expect it (the toolchain does
- // not use ldflags so these are ignored in the normal build).
- if (target->output_type() != Target::STATIC_LIBRARY)
- WriteNamedArray("OTHER_LDFLAGS", flags.ldflags, indent + kExtraIndent);
-
- // Write the compiler that XCode should use. When we're using clang, we want
- // the custom one, otherwise don't add this and the default compiler will be
- // used.
- //
- // TODO(brettw) this is a hack. We could add a way for the GN build to set
- // these values but as far as I can see this is the only use for them, so
- // currently we manually check the build config's is_clang value.
- if (IsClang(target)) {
- base::FilePath clang_path =
- target_->settings()->build_settings()->GetFullPath(SourceFile(
- "//third_party/llvm-build/Release+Asserts/bin/clang"));
- base::FilePath clang_pp_path =
- target_->settings()->build_settings()->GetFullPath(SourceFile(
- "//third_party/llvm-build/Release+Asserts/bin/clang++"));
-
- Indent(indent + kExtraIndent)
- << "'CC': '" << FilePathToUTF8(clang_path) << "',\n";
- Indent(indent + kExtraIndent)
- << "'LDPLUSPLUS': '" << FilePathToUTF8(clang_pp_path) << "',\n";
- }
-
- Indent(indent) << "},\n";
-}
-
-void GypBinaryTargetWriter::WriteLinuxFlagsForTarget(const Target* target,
- int indent) {
- Flags flags(FlagsFromTarget(target));
- WriteLinuxFlags(flags, indent);
-}
-
-void GypBinaryTargetWriter::WriteLinuxFlags(const Flags& flags, int indent) {
- WriteIncludeDirs(flags, indent);
- WriteNamedArray("defines", flags.defines, indent);
- WriteNamedArray("cflags", flags.cflags, indent);
- WriteNamedArray("cflags_c", flags.cflags_c, indent);
- WriteNamedArray("cflags_cc", flags.cflags_cc, indent);
- WriteNamedArray("cflags_objc", flags.cflags_objc, indent);
- WriteNamedArray("cflags_objcc", flags.cflags_objcc, indent);
-
- // Put libraries and library directories in with ldflags.
- Indent(indent) << "'ldflags': ["; \
- WriteArrayValues(out_, flags.ldflags);
-
- EscapeOptions escape_options;
- escape_options.mode = ESCAPE_JSON;
- for (size_t i = 0; i < flags.lib_dirs.size(); i++) {
- out_ << " '-L";
- EscapeStringToStream(out_,
- helper_.GetDirReference(flags.lib_dirs[i], false),
- escape_options);
- out_ << "',";
- }
-
- for (size_t i = 0; i < flags.libs.size(); i++) {
- out_ << " '-l";
- EscapeStringToStream(out_, flags.libs[i], escape_options);
- out_ << "',";
- }
- out_ << " ],\n";
-}
-
-void GypBinaryTargetWriter::WriteMacTargetAndHostFlags(
- const BuilderRecord* target,
- const BuilderRecord* host,
- int indent) {
- // The Mac flags are sometimes (when cross-compiling) also parameterized on
- // the toolset.
- const char kToolsetTargetCondition[] =
- "'target_conditions': [['_toolset==\"target\"', {\n";
- const char kToolsetTargetElse[] = "}, {\n";
- const char kToolsetTargetEnd[] = "}]],\n";
-
- int extra_indent = 0;
- if (host) {
- // Write out the first part of the conditional.
- Indent(indent) << kToolsetTargetCondition;
- extra_indent = kExtraIndent;
- }
-
- // Always write the target flags (may or may not be inside a target
- // conditional).
- {
- Flags flags(FlagsFromTarget(target->item()->AsTarget()));
- WriteMacFlags(target->item()->AsTarget(), flags, indent + extra_indent);
- }
-
- // Now optionally write the host conditional arm.
- if (host) {
- Indent(indent) << kToolsetTargetElse;
- Flags flags(FlagsFromTarget(host->item()->AsTarget()));
- WriteMacFlags(host->item()->AsTarget(), flags, indent + kExtraIndent);
- Indent(indent) << kToolsetTargetEnd;
- }
-}
-
-void GypBinaryTargetWriter::WriteSources(const Target* target, int indent) {
- Indent(indent) << "'sources': [\n";
-
- const Target::FileList& sources = target->sources();
- for (size_t i = 0; i < sources.size(); i++) {
- const SourceFile& input_file = sources[i];
- Indent(indent + kExtraIndent) << "'" << helper_.GetFileReference(input_file)
- << "',\n";
- }
-
- Indent(indent) << "],\n";
-}
-
-void GypBinaryTargetWriter::WriteDeps(const Target* target, int indent) {
- const LabelTargetVector& deps = target->deps();
- if (deps.empty())
- return;
-
- EscapeOptions escape_options;
- escape_options.mode = ESCAPE_JSON;
-
- Indent(indent) << "'dependencies': [\n";
- for (size_t i = 0; i < deps.size(); i++) {
- Indent(indent + kExtraIndent) << "'";
- EscapeStringToStream(out_, helper_.GetFullRefForTarget(deps[i].ptr),
- escape_options);
- out_ << "',\n";
- }
- Indent(indent) << "],\n";
-}
-
-void GypBinaryTargetWriter::WriteIncludeDirs(const Flags& flags, int indent) {
- if (flags.include_dirs.empty())
- return;
-
- EscapeOptions options;
- options.mode = ESCAPE_JSON;
-
- Indent(indent) << "'include_dirs': [";
- for (size_t i = 0; i < flags.include_dirs.size(); i++) {
- out_ << " '";
- EscapeStringToStream(out_,
- helper_.GetDirReference(flags.include_dirs[i], false),
- options);
- out_ << "',";
- }
- out_ << " ],\n";
-}
-
-void GypBinaryTargetWriter::WriteDirectDependentSettings(int indent) {
- if (target_->direct_dependent_configs().empty())
- return;
- Indent(indent) << "'direct_dependent_settings': {\n";
-
- Flags flags(FlagsFromConfigList(target_->direct_dependent_configs()));
- if (target_->settings()->IsLinux())
- WriteLinuxFlags(flags, indent + kExtraIndent);
- else if (target_->settings()->IsWin())
- WriteVCFlags(flags, indent + kExtraIndent);
- else if (target_->settings()->IsMac())
- WriteMacFlags(target_, flags, indent + kExtraIndent);
- Indent(indent) << "},\n";
-}
-
-void GypBinaryTargetWriter::WriteAllDependentSettings(int indent) {
- if (target_->all_dependent_configs().empty())
- return;
- Indent(indent) << "'all_dependent_settings': {\n";
-
- Flags flags(FlagsFromConfigList(target_->all_dependent_configs()));
- if (target_->settings()->IsLinux())
- WriteLinuxFlags(flags, indent + kExtraIndent);
- else if (target_->settings()->IsWin())
- WriteVCFlags(flags, indent + kExtraIndent);
- else if (target_->settings()->IsMac())
- WriteMacFlags(target_, flags, indent + kExtraIndent);
- Indent(indent) << "},\n";
-}
-
-GypBinaryTargetWriter::Flags GypBinaryTargetWriter::FlagsFromTarget(
- const Target* target) const {
- Flags ret;
-
- // Extracts a vector of the given type and name from the config values.
- #define EXTRACT(type, name) \
- { \
- Accumulator<type> acc(&ret.name); \
- RecursiveTargetConfigToStream<type>(target, &ConfigValues::name, \
- acc, out_); \
- }
-
- EXTRACT(std::string, defines);
- EXTRACT(SourceDir, include_dirs);
- EXTRACT(std::string, cflags);
- EXTRACT(std::string, cflags_c);
- EXTRACT(std::string, cflags_cc);
- EXTRACT(std::string, cflags_objc);
- EXTRACT(std::string, cflags_objcc);
- EXTRACT(std::string, ldflags);
-
- #undef EXTRACT
-
- const OrderedSet<SourceDir>& all_lib_dirs = target->all_lib_dirs();
- for (size_t i = 0; i < all_lib_dirs.size(); i++)
- ret.lib_dirs.push_back(all_lib_dirs[i]);
-
- const OrderedSet<std::string> all_libs = target->all_libs();
- for (size_t i = 0; i < all_libs.size(); i++)
- ret.libs.push_back(all_libs[i]);
-
- return ret;
-}
-
-GypBinaryTargetWriter::Flags GypBinaryTargetWriter::FlagsFromConfigList(
- const LabelConfigVector& configs) const {
- Flags ret;
-
- #define EXTRACT(type, name) \
- FillConfigListValues<type>(configs, &ConfigValues::name, &ret.name);
-
- EXTRACT(std::string, defines);
- EXTRACT(SourceDir, include_dirs);
- EXTRACT(std::string, cflags);
- EXTRACT(std::string, cflags_c);
- EXTRACT(std::string, cflags_cc);
- EXTRACT(std::string, cflags_objc);
- EXTRACT(std::string, cflags_objcc);
- EXTRACT(std::string, ldflags);
- EXTRACT(SourceDir, lib_dirs);
- EXTRACT(std::string, libs);
-
- #undef EXTRACT
-
- return ret;
-}
-
-void GypBinaryTargetWriter::WriteNamedArray(
- const char* name,
- const std::vector<std::string>& values,
- int indent) {
- if (values.empty())
- return;
-
- EscapeOptions options;
- options.mode = ESCAPE_JSON;
-
- Indent(indent) << "'" << name << "': [";
- WriteArrayValues(out_, values);
- out_ << " ],\n";
-}
-
« no previous file with comments | « tools/gn/gyp_binary_target_writer.h ('k') | tools/gn/gyp_binary_target_writer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698