1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "tools/gn/gyp_helper.h" 6 7 #include "tools/gn/err.h" 8 #include "tools/gn/filesystem_utils.h" 9 #include "tools/gn/settings.h" 10 #include "tools/gn/source_file.h" 11 #include "tools/gn/target.h" 12 #include "tools/gn/toolchain.h" 13 14 GypHelper::GypHelper() { 15 } 16 17 GypHelper::~GypHelper() { 18 } 19 20 SourceFile GypHelper::GetGypFileForTarget(const Target* target, 21 Err* err) const { 22 // Use the manually specified one if its there. 23 if (!target->gyp_file().is_null()) 24 return target->gyp_file(); 25 26 // Otherwise inherit the directory name. 27 const std::string& dir = target->label().dir().value(); 28 size_t last_slash = dir.size() - 1; 29 std::string dir_name; 30 if (last_slash > 0) { 31 size_t next_to_last_slash = dir.rfind('/', last_slash - 1); 32 if (next_to_last_slash != std::string::npos) { 33 dir_name = dir.substr(next_to_last_slash + 1, 34 last_slash - next_to_last_slash - 1); 35 } 36 } 37 if (dir_name.empty()) { 38 *err = Err(Location(), "Need to specify a gyp_file value for " + 39 target->label().GetUserVisibleName(false) + "\n" 40 "since I can't make up one with no name."); 41 return SourceFile(); 42 } 43 44 return SourceFile(dir + dir_name + ".gyp"); 45 } 46 47 std::string GypHelper::GetNameForTarget(const Target* target) const { 48 if (target->settings()->is_default()) 49 return target->label().name(); // Default toolchain has no suffix. 50 return target->label().name() + "_" + 51 target->settings()->toolchain_label().name(); 52 } 53 54 std::string GypHelper::GetFullRefForTarget(const Target* target) const { 55 Err err; 56 SourceFile gypfile = GetGypFileForTarget(target, &err); 57 CHECK(gypfile.is_source_absolute()) << 58 "GYP files should not be system-absolute: " << gypfile.value(); 59 60 std::string ret("<(DEPTH)/"); 61 // Trim off the leading double-slash. 62 ret.append(&gypfile.value()[2], gypfile.value().size() - 2); 63 ret.push_back(':'); 64 ret.append(GetNameForTarget(target)); 65 66 return ret; 67 } 68 69 std::string GypHelper::GetFileReference(const SourceFile& file) const { 70 std::string ret; 71 if (file.is_null()) 72 return ret; 73 74 // Use FilePath's resolver to get the system paths out (on Windows this 75 // requires special handling). Since it's absolute, it doesn't matter what 76 // we pass in as the source root. 77 if (file.is_system_absolute()) 78 return FilePathToUTF8(file.Resolve(base::FilePath())); 79 80 // Source root relative, strip the "//". 81 ret.assign("<(DEPTH)/"); 82 ret.append(&file.value()[2], file.value().size() - 2); 83 return ret; 84 } 85 86 std::string GypHelper::GetDirReference(const SourceDir& dir, 87 bool include_slash) const { 88 std::string ret; 89 if (dir.is_null()) 90 return ret; 91 92 if (dir.is_system_absolute()) { 93 ret = FilePathToUTF8(dir.Resolve(base::FilePath())); 94 } else { 95 ret.assign("<(DEPTH)/"); 96 ret.append(&dir.value()[2], dir.value().size() - 2); 97 } 98 99 // Optionally trim the slash off the end. 100 if (!ret.empty() && !include_slash && 101 (ret[ret.size() - 1] == '/' || ret[ret.size() - 1] == '\\')) 102 ret.resize(ret.size() - 1); 103 104 return ret; 105 } 106