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(); |
-} |