| Index: tools/gn/gyp_helper.cc
|
| diff --git a/tools/gn/gyp_helper.cc b/tools/gn/gyp_helper.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f69ed8f2097d29a2b0c22d9795694fe17007b4ae
|
| --- /dev/null
|
| +++ b/tools/gn/gyp_helper.cc
|
| @@ -0,0 +1,105 @@
|
| +// 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_helper.h"
|
| +
|
| +#include "tools/gn/err.h"
|
| +#include "tools/gn/filesystem_utils.h"
|
| +#include "tools/gn/settings.h"
|
| +#include "tools/gn/source_file.h"
|
| +#include "tools/gn/target.h"
|
| +#include "tools/gn/toolchain.h"
|
| +
|
| +GypHelper::GypHelper() {
|
| +}
|
| +
|
| +GypHelper::~GypHelper() {
|
| +}
|
| +
|
| +SourceFile GypHelper::GetGypFileForTarget(const Target* target,
|
| + Err* err) const {
|
| + // Use the manually specified one if its there.
|
| + if (!target->gyp_file().is_null())
|
| + return target->gyp_file();
|
| +
|
| + // Otherwise inherit the directory name.
|
| + const std::string& dir = target->label().dir().value();
|
| + size_t last_slash = dir.size() - 1;
|
| + std::string dir_name;
|
| + if (last_slash > 0) {
|
| + size_t next_to_last_slash = dir.rfind('/', last_slash - 1);
|
| + if (next_to_last_slash != std::string::npos) {
|
| + dir_name = dir.substr(next_to_last_slash + 1,
|
| + last_slash - next_to_last_slash - 1);
|
| + }
|
| + }
|
| + if (dir_name.empty()) {
|
| + *err = Err(Location(), "Need to specify a gyp_file value for " +
|
| + target->label().GetUserVisibleName(false) + "\n"
|
| + "since I can't make up one with no name.");
|
| + return SourceFile();
|
| + }
|
| +
|
| + return SourceFile(dir + dir_name + ".gyp");
|
| +}
|
| +
|
| +std::string GypHelper::GetNameForTarget(const Target* target) const {
|
| + const Toolchain* toolchain = target->settings()->toolchain();
|
| + if (toolchain->is_default())
|
| + return target->label().name(); // Default toolchain has no suffix.
|
| + return target->label().name() + "_" + toolchain->label().name();
|
| +}
|
| +
|
| +std::string GypHelper::GetFullRefForTarget(const Target* target) const {
|
| + Err err;
|
| + SourceFile gypfile = GetGypFileForTarget(target, &err);
|
| + CHECK(gypfile.is_source_absolute()) <<
|
| + "GYP files should not be system-absolute: " << gypfile.value();
|
| +
|
| + std::string ret("<(DEPTH)/");
|
| + // Trim off the leading double-slash.
|
| + ret.append(&gypfile.value()[2], gypfile.value().size() - 2);
|
| + ret.push_back(':');
|
| + ret.append(GetNameForTarget(target));
|
| +
|
| + return ret;
|
| +}
|
| +
|
| +std::string GypHelper::GetFileReference(const SourceFile& file) const {
|
| + std::string ret;
|
| + if (file.is_null())
|
| + return ret;
|
| +
|
| + // Use FilePath's resolver to get the system paths out (on Windows this
|
| + // requires special handling). Since it's absolute, it doesn't matter what
|
| + // we pass in as the source root.
|
| + if (file.is_system_absolute())
|
| + return FilePathToUTF8(file.Resolve(base::FilePath()));
|
| +
|
| + // Source root relative, strip the "//".
|
| + ret.assign("<(DEPTH)/");
|
| + ret.append(&file.value()[2], file.value().size() - 2);
|
| + return ret;
|
| +}
|
| +
|
| +std::string GypHelper::GetDirReference(const SourceDir& dir,
|
| + bool include_slash) const {
|
| + std::string ret;
|
| + if (dir.is_null())
|
| + return ret;
|
| +
|
| + if (dir.is_system_absolute()) {
|
| + ret = FilePathToUTF8(dir.Resolve(base::FilePath()));
|
| + } else {
|
| + ret.assign("<(DEPTH)/");
|
| + ret.append(&dir.value()[2], dir.value().size() - 2);
|
| + }
|
| +
|
| + // Optionally trim the slash off the end.
|
| + if (!ret.empty() && !include_slash &&
|
| + (ret[ret.size() - 1] == '/' || ret[ret.size() - 1] == '\\'))
|
| + ret.resize(ret.size() - 1);
|
| +
|
| + return ret;
|
| +}
|
|
|