Index: tools/gn/command_gyp.cc |
diff --git a/tools/gn/command_gyp.cc b/tools/gn/command_gyp.cc |
index ff6a5c3875960a8f22e460e3d3dab06e06b0224b..570a8c405201f7ae8c1e0fabc17a7f080a5ccb40 100644 |
--- a/tools/gn/command_gyp.cc |
+++ b/tools/gn/command_gyp.cc |
@@ -40,26 +40,18 @@ struct Setups { |
Setups() |
: debug(NULL), |
release(NULL), |
- host_debug(NULL), |
- host_release(NULL), |
debug64(NULL), |
release64(NULL), |
xcode_debug(NULL), |
- xcode_release(NULL), |
- xcode_host_debug(NULL), |
- xcode_host_release(NULL) { |
+ xcode_release(NULL) { |
} |
Setup* debug; |
DependentSetup* release; |
- DependentSetup* host_debug; |
- DependentSetup* host_release; |
DependentSetup* debug64; |
DependentSetup* release64; |
DependentSetup* xcode_debug; |
DependentSetup* xcode_release; |
- DependentSetup* xcode_host_debug; |
- DependentSetup* xcode_host_release; |
}; |
struct TargetVectors { |
@@ -84,31 +76,24 @@ SourceDir AppendDirSuffix(const SourceDir& base, const std::string& suffix) { |
return SourceDir(DirectoryWithNoLastSlash(base) + suffix + "/"); |
} |
-// We need a "host" build when targeting a device (iOS, Android, ChromeOS). The |
-// host build will correspond to the the system doing the building. |
-bool NeedsHostBuild(CommonSetup* setup) { |
- Args& args = setup->build_settings().build_args(); |
- const Value* os_override = args.GetArgOverride("os"); |
- if (!os_override) |
- return false; // Target OS is the default, which is always the host. |
- if (os_override->type() != Value::STRING) |
- return false; // Build will likely fail later. |
- return os_override->string_value() == "android" || |
- os_override->string_value() == "ios" || |
- os_override->string_value() == "chromeos"; |
-} |
+// Returns the empty label if there is no separate host build. |
+Label GetHostToolchain(const Setups& setups) { |
+ const Loader* loader = setups.debug->loader(); |
+ const Settings* default_settings = |
+ loader->GetToolchainSettings(loader->GetDefaultToolchain()); |
-void SetupHostBuildParams(CommonSetup* setup) { |
- // Re-override the target OS to the default of the current system. |
-#if defined(OS_WIN) |
- const char kDefaultOs[] = "win"; |
-#elif defined(OS_MACOSX) |
- const char kDefaultOs[] = "mac"; |
-#elif defined(OS_LINUX) |
- const char kDefaultOs[] = "linux"; |
-#endif |
- setup->build_settings().build_args().AddArgOverride( |
- "os", Value(NULL, kDefaultOs)); |
+ // Chrome's master build config file puts the host toolchain label into the |
+ // variable "host_toolchain". |
+ const Value* host_value = |
+ default_settings->base_config()->GetValue("host_toolchain"); |
+ if (!host_value || host_value->type() != Value::STRING) |
+ return Label(); |
+ |
+ Err err; |
+ Label host_label = Label::Resolve(SourceDir(), Label(), *host_value, &err); |
+ if (host_label == loader->GetDefaultToolchain()) |
+ return Label(); // Host and target matches, there is no host build. |
+ return host_label; |
} |
std::vector<const BuilderRecord*> GetAllResolvedTargetRecords( |
@@ -125,55 +110,73 @@ std::vector<const BuilderRecord*> GetAllResolvedTargetRecords( |
return result; |
} |
+// Adds all targets to the map that match the given toolchain, writing them to |
+// the given destiation vector of the record group. If toolchain is empty, it |
+// indicates the default toolchain should be matched. |
void CorrelateRecordVector(const RecordVector& records, |
+ const Label& toolchain, |
CorrelatedTargetsMap* correlated, |
const BuilderRecord* TargetGroup::* record_ptr) { |
+ if (records.empty()) |
+ return; |
+ |
+ Label search_toolchain = toolchain; |
+ if (search_toolchain.is_null()) { |
+ // Find the default toolchain. |
+ search_toolchain = |
+ records[0]->item()->settings()->default_toolchain_label(); |
+ } |
+ |
for (size_t i = 0; i < records.size(); i++) { |
const BuilderRecord* record = records[i]; |
- (*correlated)[record->label().GetWithNoToolchain()].*record_ptr = record; |
+ if (record->label().GetToolchainLabel() == search_toolchain) |
+ (*correlated)[record->label().GetWithNoToolchain()].*record_ptr = record; |
} |
} |
- |
// Groups targets sharing the same label between debug and release. |
// |
-// We strip the toolchain label because the 64-bit and 32-bit builds, for |
-// example, will have different toolchains but we want to correlate them. |
+// If the host toolchain is nonempty, we'll search for targets with this |
+// alternate toolchain and assign them to the corresponding "host" groups. |
// |
-// TODO(brettw) this assumes that everything in the build has the same |
-// toolchain. To support cross-compiling and nacl, we'll need to differentiate |
-// the 32-vs-64-bit case and the default-toolchain-vs-not case. When we find |
-// a target not using hte default toolchain, we should probably just shell |
-// out to ninja. |
+// TODO(brettw) this doesn't handle any toolchains other than the target or |
+// host ones. To support nacl, we'll need to differentiate the 32-vs-64-bit |
+// case and the default-toolchain-vs-not case. When we find a target not using |
+// hte default toolchain, we should probably just shell out to ninja. |
void CorrelateTargets(const TargetVectors& targets, |
+ const Label& host_toolchain, |
CorrelatedTargetsMap* correlated) { |
// Normal. |
- CorrelateRecordVector( |
- targets.debug, correlated, &TargetGroup::debug); |
- CorrelateRecordVector( |
- targets.release, correlated, &TargetGroup::release); |
- |
- // Host build. |
- CorrelateRecordVector( |
- targets.host_debug, correlated, &TargetGroup::host_debug); |
- CorrelateRecordVector( |
- targets.host_release, correlated, &TargetGroup::host_release); |
+ CorrelateRecordVector(targets.debug, Label(), correlated, |
+ &TargetGroup::debug); |
+ CorrelateRecordVector(targets.release, Label(), correlated, |
+ &TargetGroup::release); |
// 64-bit build. |
- CorrelateRecordVector( |
- targets.debug64, correlated, &TargetGroup::debug64); |
- CorrelateRecordVector( |
- targets.release64, correlated, &TargetGroup::release64); |
+ CorrelateRecordVector(targets.debug64, Label(), correlated, |
+ &TargetGroup::debug64); |
+ CorrelateRecordVector(targets.release64, Label(), correlated, |
+ &TargetGroup::release64); |
// XCode build. |
- CorrelateRecordVector( |
- targets.xcode_debug, correlated, &TargetGroup::xcode_debug); |
- CorrelateRecordVector( |
- targets.xcode_release, correlated, &TargetGroup::xcode_release); |
- CorrelateRecordVector( |
- targets.xcode_host_debug, correlated, &TargetGroup::xcode_host_debug); |
- CorrelateRecordVector( |
- targets.xcode_host_release, correlated, &TargetGroup::xcode_host_release); |
+ CorrelateRecordVector(targets.xcode_debug, Label(), correlated, |
+ &TargetGroup::xcode_debug); |
+ CorrelateRecordVector(targets.xcode_release, Label(), correlated, |
+ &TargetGroup::xcode_release); |
+ |
+ if (!host_toolchain.is_null()) { |
+ // Normal host build. |
+ CorrelateRecordVector(targets.debug, host_toolchain, correlated, |
+ &TargetGroup::host_debug); |
+ CorrelateRecordVector(targets.release, host_toolchain, correlated, |
+ &TargetGroup::host_release); |
+ |
+ // XCode build. |
+ CorrelateRecordVector(targets.xcode_debug, host_toolchain, correlated, |
+ &TargetGroup::xcode_host_debug); |
+ CorrelateRecordVector(targets.xcode_release, host_toolchain, correlated, |
+ &TargetGroup::xcode_host_release); |
+ } |
} |
// Verifies that both debug and release variants match. They can differ only |
@@ -247,18 +250,9 @@ bool EnsureTargetsMatch(const TargetGroup& group, Err* err) { |
std::pair<int, int> WriteGypFiles(Setups& setups, Err* err) { |
TargetVectors targets; |
- // Group all targets by output GYP file name. |
targets.debug = GetAllResolvedTargetRecords(setups.debug->builder()); |
targets.release = GetAllResolvedTargetRecords(setups.release->builder()); |
- // Host build is optional. |
- if (setups.host_debug && setups.host_release) { |
- targets.host_debug = |
- GetAllResolvedTargetRecords(setups.host_debug->builder()); |
- targets.host_release = |
- GetAllResolvedTargetRecords(setups.host_release->builder()); |
- } |
- |
// 64-bit build is optional. |
if (setups.debug64 && setups.release64) { |
targets.debug64 = |
@@ -274,16 +268,10 @@ std::pair<int, int> WriteGypFiles(Setups& setups, Err* err) { |
targets.xcode_release = |
GetAllResolvedTargetRecords(setups.xcode_release->builder()); |
} |
- if (setups.xcode_host_debug && setups.xcode_host_release) { |
- targets.xcode_host_debug = |
- GetAllResolvedTargetRecords(setups.xcode_host_debug->builder()); |
- targets.xcode_host_release = |
- GetAllResolvedTargetRecords(setups.xcode_host_release->builder()); |
- } |
// Match up the debug and release version of each target by label. |
CorrelatedTargetsMap correlated; |
- CorrelateTargets(targets, &correlated); |
+ CorrelateTargets(targets, GetHostToolchain(setups), &correlated); |
GypHelper helper; |
GroupedTargetsMap grouped_targets; |
@@ -421,19 +409,6 @@ int RunGyp(const std::vector<std::string>& args) { |
setups.release->build_settings().SetBuildDir( |
AppendDirSuffix(base_build_dir, ".Release")); |
- // Host build. |
- if (NeedsHostBuild(setups.debug)) { |
- setups.host_debug = new DependentSetup(setups.debug); |
- setups.host_debug->build_settings().SetBuildDir( |
- AppendDirSuffix(base_build_dir, ".HostDebug")); |
- SetupHostBuildParams(setups.host_debug); |
- |
- setups.host_release = new DependentSetup(setups.release); |
- setups.host_release->build_settings().SetBuildDir( |
- AppendDirSuffix(base_build_dir, ".HostRelease")); |
- SetupHostBuildParams(setups.host_release); |
- } |
- |
// 64-bit build (Windows only). |
#if defined(OS_WIN) |
static const char kForceWin64[] = "force_win64"; |
@@ -464,26 +439,10 @@ int RunGyp(const std::vector<std::string>& args) { |
kGypXCode, Value(NULL, true)); |
setups.xcode_release->build_settings().SetBuildDir( |
AppendDirSuffix(base_build_dir, ".XCodeRelease")); |
- |
- if (NeedsHostBuild(setups.debug)) { |
- setups.xcode_host_debug = new DependentSetup(setups.xcode_debug); |
- setups.xcode_host_debug->build_settings().SetBuildDir( |
- AppendDirSuffix(base_build_dir, ".XCodeHostDebug")); |
- SetupHostBuildParams(setups.xcode_host_debug); |
- |
- setups.xcode_host_release = new DependentSetup(setups.xcode_release); |
- setups.xcode_host_release->build_settings().SetBuildDir( |
- AppendDirSuffix(base_build_dir, ".XCodeHostRelease")); |
- SetupHostBuildParams(setups.xcode_host_release); |
- } |
#endif |
// Run all the builds in parellel. |
setups.release->RunPreMessageLoop(); |
- if (setups.host_debug && setups.host_release) { |
- setups.host_debug->RunPreMessageLoop(); |
- setups.host_release->RunPreMessageLoop(); |
- } |
if (setups.debug64 && setups.release64) { |
setups.debug64->RunPreMessageLoop(); |
setups.release64->RunPreMessageLoop(); |
@@ -492,20 +451,12 @@ int RunGyp(const std::vector<std::string>& args) { |
setups.xcode_debug->RunPreMessageLoop(); |
setups.xcode_release->RunPreMessageLoop(); |
} |
- if (setups.xcode_host_debug && setups.xcode_host_release) { |
- setups.xcode_host_debug->RunPreMessageLoop(); |
- setups.xcode_host_release->RunPreMessageLoop(); |
- } |
if (!setups.debug->Run()) |
return 1; |
if (!setups.release->RunPostMessageLoop()) |
return 1; |
- if (setups.host_debug && !setups.host_debug->RunPostMessageLoop()) |
- return 1; |
- if (setups.host_release && !setups.host_release->RunPostMessageLoop()) |
- return 1; |
if (setups.debug64 && !setups.debug64->RunPostMessageLoop()) |
return 1; |
if (setups.release64 && !setups.release64->RunPostMessageLoop()) |
@@ -514,12 +465,6 @@ int RunGyp(const std::vector<std::string>& args) { |
return 1; |
if (setups.xcode_release && !setups.xcode_release->RunPostMessageLoop()) |
return 1; |
- if (setups.xcode_host_debug && |
- !setups.xcode_host_debug->RunPostMessageLoop()) |
- return 1; |
- if (setups.xcode_host_release && |
- !setups.xcode_host_release->RunPostMessageLoop()) |
- return 1; |
Err err; |
std::pair<int, int> counts = WriteGypFiles(setups, &err); |