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

Unified Diff: tools/gn/ninja_helper.cc

Issue 440333002: Support more configurability in GN toolchains (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: unsigned check Created 6 years, 4 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/ninja_helper.h ('k') | tools/gn/ninja_helper_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/ninja_helper.cc
diff --git a/tools/gn/ninja_helper.cc b/tools/gn/ninja_helper.cc
deleted file mode 100644
index 956e74c276b3d5db021e242de2b795d3c558b577..0000000000000000000000000000000000000000
--- a/tools/gn/ninja_helper.cc
+++ /dev/null
@@ -1,240 +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/ninja_helper.h"
-
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-#include "tools/gn/filesystem_utils.h"
-#include "tools/gn/string_utils.h"
-#include "tools/gn/target.h"
-
-namespace {
-
-const char kObjectDirNoSlash[] = "obj";
-
-} // namespace
-
-NinjaHelper::NinjaHelper(const BuildSettings* build_settings)
- : build_settings_(build_settings) {
- build_to_src_no_last_slash_ = build_settings->build_to_source_dir_string();
- if (!build_to_src_no_last_slash_.empty() &&
- build_to_src_no_last_slash_[build_to_src_no_last_slash_.size() - 1] ==
- '/')
- build_to_src_no_last_slash_.resize(build_to_src_no_last_slash_.size() - 1);
-
- build_to_src_system_no_last_slash_ = build_to_src_no_last_slash_;
-}
-
-NinjaHelper::~NinjaHelper() {
-}
-
-std::string NinjaHelper::GetTopleveOutputDir() const {
- return kObjectDirNoSlash;
-}
-
-OutputFile NinjaHelper::GetTargetOutputDir(const Target* target) const {
- OutputFile ret(target->settings()->toolchain_output_subdir());
- ret.value().append(kObjectDirNoSlash);
- AppendStringPiece(&ret.value(),
- target->label().dir().SourceAbsoluteWithOneSlash());
- return ret;
-}
-
-OutputFile NinjaHelper::GetNinjaFileForTarget(const Target* target) const {
- OutputFile ret = GetTargetOutputDir(target);
- ret.value().append(target->label().name());
- ret.value().append(".ninja");
- return ret;
-}
-
-OutputFile NinjaHelper::GetNinjaFileForToolchain(
- const Settings* settings) const {
- OutputFile ret;
- ret.value().append(settings->toolchain_output_subdir().value());
- ret.value().append("toolchain.ninja");
- return ret;
-}
-
-// In Python, GypPathToUniqueOutput does the qualification. The only case where
-// the Python version doesn't qualify the name is for target outputs, which we
-// handle in a separate function.
-OutputFile NinjaHelper::GetOutputFileForSource(
- const Target* target,
- const SourceFile& source,
- SourceFileType type) const {
- // Extract the filename and remove the extension (keep the dot).
- base::StringPiece filename = FindFilename(&source.value());
- std::string name(filename.data(), filename.size());
- size_t extension_offset = FindExtensionOffset(name);
- CHECK(extension_offset != std::string::npos);
- name.resize(extension_offset);
-
- // Append the new extension.
- switch (type) {
- case SOURCE_ASM:
- case SOURCE_C:
- case SOURCE_CC:
- case SOURCE_M:
- case SOURCE_MM:
- case SOURCE_S:
- name.append(target->settings()->IsWin() ? "obj" : "o");
- break;
-
- case SOURCE_RC:
- name.append("res");
- break;
-
- // Pass .o/.obj files through unchanged.
- case SOURCE_O: {
- // System-absolute file names get preserved (they don't need to be
- // rebased relative to the build dir).
- if (source.is_system_absolute())
- return OutputFile(source.value());
-
- // Files that are already inside the build dir should not be made
- // relative to the source tree. Doing so will insert an unnecessary
- // "../.." into the path which won't match the corresponding target
- // name in ninja.
- CHECK(build_settings_->build_dir().is_source_absolute());
- CHECK(source.is_source_absolute());
- if (StartsWithASCII(source.value(),
- build_settings_->build_dir().value(),
- true)) {
- return OutputFile(
- source.value().substr(
- build_settings_->build_dir().value().size()));
- }
-
- // Construct the relative location of the file from the build dir.
- OutputFile ret(build_to_src_no_last_slash());
- source.SourceAbsoluteWithOneSlash().AppendToString(&ret.value());
- return ret;
- }
-
- case SOURCE_H:
- case SOURCE_UNKNOWN:
- NOTREACHED();
- return OutputFile();
- }
-
- // Use the scheme <path>/<target>.<name>.<extension> so that all output
- // names are unique to different targets.
-
- // This will look like "obj" or "toolchain_name/obj".
- OutputFile ret(target->settings()->toolchain_output_subdir());
- ret.value().append(kObjectDirNoSlash);
-
- // Find the directory, assume it starts with two slashes, and trim to one.
- base::StringPiece dir = FindDir(&source.value());
- CHECK(dir.size() >= 2 && dir[0] == '/' && dir[1] == '/')
- << "Source file isn't in the source repo: " << dir;
- AppendStringPiece(&ret.value(), dir.substr(1));
-
- ret.value().append(target->label().name());
- ret.value().append(".");
- ret.value().append(name);
- return ret;
-}
-
-OutputFile NinjaHelper::GetTargetOutputFile(const Target* target) const {
- OutputFile ret;
-
- // Use the output name if given, fall back to target name if not.
- const std::string& name = target->output_name().empty() ?
- target->label().name() : target->output_name();
-
- // This is prepended to the output file name. Some platforms get "lib"
- // prepended to library names. but be careful not to make a duplicate (e.g.
- // some targets like "libxml" already have the "lib" in the name).
- const char* prefix;
- if (!target->settings()->IsWin() &&
- (target->output_type() == Target::SHARED_LIBRARY ||
- target->output_type() == Target::STATIC_LIBRARY) &&
- name.compare(0, 3, "lib") != 0)
- prefix = "lib";
- else
- prefix = "";
-
- const char* extension;
- if (target->output_extension().empty()) {
- if (target->output_type() == Target::GROUP ||
- target->output_type() == Target::SOURCE_SET ||
- target->output_type() == Target::COPY_FILES ||
- target->output_type() == Target::ACTION ||
- target->output_type() == Target::ACTION_FOREACH) {
- extension = "stamp";
- } else {
- extension = GetExtensionForOutputType(target->output_type(),
- target->settings()->target_os());
- }
- } else {
- extension = target->output_extension().c_str();
- }
-
- // Everything goes into the toolchain directory (which will be empty for the
- // default toolchain, and will end in a slash otherwise).
- ret.value().append(target->settings()->toolchain_output_subdir().value());
-
- // Binaries and shared libraries go into the toolchain root.
- if (target->output_type() == Target::EXECUTABLE ||
- target->output_type() == Target::SHARED_LIBRARY) {
- // Generate a name like "<toolchain>/<prefix><name>.<extension>".
- ret.value().append(prefix);
- ret.value().append(name);
- if (extension[0]) {
- ret.value().push_back('.');
- ret.value().append(extension);
- }
- return ret;
- }
-
- // Everything else goes next to the target's .ninja file like
- // "<toolchain>/obj/<path>/<name>.<extension>".
- ret.value().append(kObjectDirNoSlash);
- AppendStringPiece(&ret.value(),
- target->label().dir().SourceAbsoluteWithOneSlash());
- ret.value().append(prefix);
- ret.value().append(name);
- if (extension[0]) {
- ret.value().push_back('.');
- ret.value().append(extension);
- }
- return ret;
-}
-
-std::string NinjaHelper::GetRulePrefix(const Settings* settings) const {
- // Don't prefix the default toolchain so it looks prettier, prefix everything
- // else.
- if (settings->is_default())
- return std::string(); // Default toolchain has no prefix.
- return settings->toolchain_label().name() + "_";
-}
-
-std::string NinjaHelper::GetRuleForSourceType(const Settings* settings,
- SourceFileType type) const {
- // This function may be hot since it will be called for every source file
- // in the tree. We could cache the results to avoid making a string for
- // every invocation.
- std::string prefix = GetRulePrefix(settings);
-
- if (type == SOURCE_C)
- return prefix + "cc";
- if (type == SOURCE_CC)
- return prefix + "cxx";
- if (type == SOURCE_M)
- return prefix + "objc";
- if (type == SOURCE_MM)
- return prefix + "objcxx";
- if (type == SOURCE_RC)
- return prefix + "rc";
- if (type == SOURCE_S)
- return prefix + "cc"; // Assembly files just get compiled by CC.
-
- // TODO(brettw) asm files.
-
- // .obj files have no rules to make them (they're already built) so we return
- // the enpty string for SOURCE_O.
- return std::string();
-}
« no previous file with comments | « tools/gn/ninja_helper.h ('k') | tools/gn/ninja_helper_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698