summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-22 21:59:55 +0000
committerbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-22 21:59:55 +0000
commit12e400a10af6a47105c2294bb7b20084108eebe3 (patch)
treedf6449f952bdda6bcd489d30269f335d100b3b70
parentb3c0ee731210b12a18adc0362212341218462b83 (diff)
downloadchromium_src-12e400a10af6a47105c2294bb7b20084108eebe3.zip
chromium_src-12e400a10af6a47105c2294bb7b20084108eebe3.tar.gz
chromium_src-12e400a10af6a47105c2294bb7b20084108eebe3.tar.bz2
Improve Windows GN build setup.
Properly setup a new output build directory on Windows (previously you had to manually copy some files into it). It now creates the environment block and the gyp-win-tool. The include and library paths are moved to the command line and removed from the environment which is cleaner and more explicit. BUG= R=scottmg@chromium.org Review URL: https://codereview.chromium.org/34603009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@230223 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--tools/gn/build_settings.cc4
-rw-r--r--tools/gn/build_settings.h3
-rw-r--r--tools/gn/ninja_binary_target_writer.cc2
-rw-r--r--tools/gn/ninja_script_target_writer.cc2
-rw-r--r--tools/gn/ninja_target_writer.cc6
-rw-r--r--tools/gn/ninja_target_writer.h2
-rw-r--r--tools/gn/secondary/build/config/win/BUILD.gn23
-rw-r--r--tools/gn/secondary/build/toolchain/win/BUILD.gn77
-rw-r--r--tools/gn/secondary/build/toolchain/win/setup_toolchain.py72
9 files changed, 139 insertions, 52 deletions
diff --git a/tools/gn/build_settings.cc b/tools/gn/build_settings.cc
index 2ac7389..af81467 100644
--- a/tools/gn/build_settings.cc
+++ b/tools/gn/build_settings.cc
@@ -4,6 +4,7 @@
#include "tools/gn/build_settings.h"
+#include "base/file_util.h"
#include "tools/gn/filesystem_utils.h"
BuildSettings::BuildSettings()
@@ -45,6 +46,9 @@ void BuildSettings::SetSecondarySourcePath(const SourceDir& d) {
void BuildSettings::SetBuildDir(const SourceDir& d) {
build_dir_ = d;
build_to_source_dir_string_ = InvertDir(d);
+
+ DCHECK(!root_path_.empty());
+ file_util::CreateDirectory(build_dir_.Resolve(root_path_));
}
base::FilePath BuildSettings::GetFullPath(const SourceFile& file) const {
diff --git a/tools/gn/build_settings.h b/tools/gn/build_settings.h
index fc175df..231d040 100644
--- a/tools/gn/build_settings.h
+++ b/tools/gn/build_settings.h
@@ -60,7 +60,8 @@ class BuildSettings {
// The build directory is the root of all output files. The default toolchain
// files go into here, and non-default toolchains will have separate
- // toolchain-specific root directories inside this.
+ // toolchain-specific root directories inside this. This should be set after
+ // the root path for the proper directory to be created.
const SourceDir& build_dir() const { return build_dir_; }
void SetBuildDir(const SourceDir& dir);
diff --git a/tools/gn/ninja_binary_target_writer.cc b/tools/gn/ninja_binary_target_writer.cc
index aefb513..85dd0cd 100644
--- a/tools/gn/ninja_binary_target_writer.cc
+++ b/tools/gn/ninja_binary_target_writer.cc
@@ -95,8 +95,6 @@ NinjaBinaryTargetWriter::~NinjaBinaryTargetWriter() {
}
void NinjaBinaryTargetWriter::Run() {
- WriteEnvironment();
-
WriteCompilerVars();
std::vector<OutputFile> obj_files;
diff --git a/tools/gn/ninja_script_target_writer.cc b/tools/gn/ninja_script_target_writer.cc
index 4678ba0..b362976 100644
--- a/tools/gn/ninja_script_target_writer.cc
+++ b/tools/gn/ninja_script_target_writer.cc
@@ -22,8 +22,6 @@ NinjaScriptTargetWriter::~NinjaScriptTargetWriter() {
}
void NinjaScriptTargetWriter::Run() {
- WriteEnvironment();
-
FileTemplate args_template(target_->script_values().args());
std::string custom_rule_name = WriteRuleDefinition(args_template);
std::string implicit_deps = GetSourcesImplicitDeps();
diff --git a/tools/gn/ninja_target_writer.cc b/tools/gn/ninja_target_writer.cc
index 4bbc1f5..a7bd6cc 100644
--- a/tools/gn/ninja_target_writer.cc
+++ b/tools/gn/ninja_target_writer.cc
@@ -85,12 +85,6 @@ void NinjaTargetWriter::RunAndWriteFile(const Target* target) {
static_cast<int>(contents.size()));
}
-void NinjaTargetWriter::WriteEnvironment() {
- // TODO(brettw) have a better way to do the environment setup on Windows.
- if (target_->settings()->IsWin())
- out_ << "arch = environment.x86\n";
-}
-
const Toolchain* NinjaTargetWriter::GetToolchain() const {
return target_->settings()->toolchain();
}
diff --git a/tools/gn/ninja_target_writer.h b/tools/gn/ninja_target_writer.h
index 9e6f240..c9c72a7 100644
--- a/tools/gn/ninja_target_writer.h
+++ b/tools/gn/ninja_target_writer.h
@@ -27,8 +27,6 @@ class NinjaTargetWriter {
virtual void Run() = 0;
protected:
- void WriteEnvironment();
-
// Returns the toolchain associated with the target.
const Toolchain* GetToolchain() const;
diff --git a/tools/gn/secondary/build/config/win/BUILD.gn b/tools/gn/secondary/build/config/win/BUILD.gn
index efdc5ab..e101c2b 100644
--- a/tools/gn/secondary/build/config/win/BUILD.gn
+++ b/tools/gn/secondary/build/config/win/BUILD.gn
@@ -3,7 +3,12 @@
# found in the LICENSE file.
declare_args() {
+ # Full path to the Windows SDK, not including a backslash at the end.
windows_sdk_path = "C:\Program Files (x86)\Windows Kits\8.0"
+
+ # Full path to the Visual Studio installation, not including a backslash
+ # at the end.
+ visual_studio_path = "C:\Program Files (x86)\Microsoft Visual Studio 10.0"
}
# Compiler setup for the Windows SDK. Applied to all targets.
@@ -25,10 +30,15 @@ config("sdk") {
"WINVER=0x0602",
]
+ # The Windows SDK include directories must be first. They both have a sal.h,
+ # and the SDK one is newer and the SDK uses some newer features from it not
+ # present in the Visual Studio one.
include_dirs = [
"$windows_sdk_path\Include\shared",
"$windows_sdk_path\Include\um",
"$windows_sdk_path\Include\winrt",
+ "$visual_studio_path\VC\include",
+ "$visual_studio_path\VC\atlmfc\include",
]
}
@@ -39,14 +49,21 @@ config("sdk_link") {
if (is_64bit) {
ldflags = [ "/MACHINE:X64" ]
- libs = [ "$windows_sdk_path\Lib\win8\um\x64" ]
+ lib_dirs = [
+ "$windows_sdk_path\Lib\win8\um\x64",
+ "$visual_studio_path\VC\lib\amd64",
+ "$visual_studio_path\VC\atlmfc\lib\amd64",
+ ]
} else {
ldflags = [
"/MACHINE:X86",
"/SAFESEH", # Not compatible with x64 so use only for x86.
]
- lib_dirs = [ "$windows_sdk_path\Lib\win8\um\x86" ]
-
+ lib_dirs = [
+ "$windows_sdk_path\Lib\win8\um\x86",
+ "$visual_studio_path\VC\lib",
+ "$visual_studio_path\VC\atlmfc\lib",
+ ]
#if (!is_asan) { TODO(brettw) Address Sanitizer
# ldflags += "/largeaddressaware"
#}
diff --git a/tools/gn/secondary/build/toolchain/win/BUILD.gn b/tools/gn/secondary/build/toolchain/win/BUILD.gn
index 5887b92..95cd947 100644
--- a/tools/gn/secondary/build/toolchain/win/BUILD.gn
+++ b/tools/gn/secondary/build/toolchain/win/BUILD.gn
@@ -13,11 +13,16 @@ assert(is_win)
#
# The list contains the include path as its only element. (I'm expecting to
# add more so it's currently a list inside a list.)
-msvc_config = [["foo"]]
#exec_script("get_msvc_config.py",
# [relative_root_output_dir],
# "value")
+# This will save the environment block and and copy the gyp-win-tool to the
+# build directory. We pass in the source file of the win tool.
+gyp_win_tool_source =
+ rebase_path("//tools/gyp/pylib/gyp/win_tool.py", ".", root_build_dir)
+exec_script("setup_toolchain.py", [ gyp_win_tool_source ], "value")
+
# 32-bit toolchain -------------------------------------------------------------
toolchain("32") {
@@ -26,47 +31,47 @@ toolchain("32") {
lib_dir_prefix="/LIBPATH:"
tool("cc") {
- command = "ninja -t msvc -e \$arch -- cl.exe /nologo /showIncludes /FC @\$out.rsp /c \$in /Fo\$out /Fd\$pdbname"
+ command = "ninja -t msvc -e environment.x86 -- cl.exe /nologo /showIncludes /FC @\$out.rsp /c \$in /Fo\$out /Fd\$pdbname"
description = "CC \$out"
rspfile = "\$out.rsp"
rspfile_content = "\$defines \$includes \$cflags \$cflags_c"
deps = "msvc"
}
tool("cxx") {
- command = "ninja -t msvc -e \$arch -- cl.exe /nologo /showIncludes /FC @\$out.rsp /c \$in /Fo\$out /Fd\$pdbname"
+ command = "ninja -t msvc -e environment.x86 -- cl.exe /nologo /showIncludes /FC @\$out.rsp /c \$in /Fo\$out /Fd\$pdbname"
description = "CXX \$out"
rspfile = "\$out.rsp"
rspfile_content = "\$defines \$includes \$cflags \$cflags_cc"
deps = "msvc"
}
#tool("idl") {
- # command = $python_path gyp-win-tool midl-wrapper \$arch \$outdir \$tlb \$h \$dlldata \$iid \$
+ # command = $python_path gyp-win-tool midl-wrapper environment.x86 \$outdir \$tlb \$h \$dlldata \$iid \$
# \$proxy \$in \$idlflags
# description = IDL \$in
#}
tool("rc") {
- command = "$python_path gyp-win-tool rc-wrapper \$arch rc.exe \$defines \$includes \$rcflags /fo\$out \$in"
+ command = "$python_path gyp-win-tool rc-wrapper environment.x86 rc.exe \$defines \$includes \$rcflags /fo\$out \$in"
description = "RC \$in"
}
#tool("asm") {
- # command = $python_path gyp-win-tool asm-wrapper \$arch ml.exe \$defines \$includes /c /Fo \$
+ # command = $python_path gyp-win-tool asm-wrapper environment.x86 ml.exe \$defines \$includes /c /Fo \$
# \$out \$in
# description = ASM \$in
#}
tool("alink") {
- command = "$python_path gyp-win-tool link-wrapper \$arch lib.exe /nologo /ignore:4221 /OUT:\$out @\$out.rsp"
+ command = "$python_path gyp-win-tool link-wrapper environment.x86 lib.exe /nologo /ignore:4221 /OUT:\$out @\$out.rsp"
description = "LIB \$out"
rspfile = "\$out.rsp"
rspfile_content = "\$in_newline \$libflags"
}
#tool("solink_embed_inc") {
- # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag \$
+ # command = cmd /c $python_path gyp-win-tool link-wrapper environment.x86 link.exe /nologo \$implibflag \$
# /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool \$
- # manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && \$
- # $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests \$
- # -out:\$dll.manifest && $python_path gyp-win-tool manifest-to-rc \$arch \$dll.manifest \$
- # \$dll.manifest.rc 2 && $python_path gyp-win-tool rc-wrapper \$arch rc.exe \$
- # \$dll.manifest.rc && $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$
+ # manifest-wrapper environment.x86 cmd /c if exist \$dll.manifest del \$dll.manifest && \$
+ # $python_path gyp-win-tool manifest-wrapper environment.x86 mt.exe -nologo -manifest \$manifests \$
+ # -out:\$dll.manifest && $python_path gyp-win-tool manifest-to-rc environment.x86 \$dll.manifest \$
+ # \$dll.manifest.rc 2 && $python_path gyp-win-tool rc-wrapper environment.x86 rc.exe \$
+ # \$dll.manifest.rc && $python_path gyp-win-tool link-wrapper environment.x86 link.exe /nologo \$
# \$implibflag /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp \$dll.manifest.res
# description = LINK_EMBED_INC(DLL) \$dll
# restat = 1
@@ -74,13 +79,13 @@ toolchain("32") {
# rspfile_content = \$libs \$in_newline \$ldflags
#}
#tool("solink_module_embed_inc") {
- # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag \$
+ # command = cmd /c $python_path gyp-win-tool link-wrapper environment.x86 link.exe /nologo \$implibflag \$
# /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool \$
- # manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && \$
- # $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests \$
- # -out:\$dll.manifest && $python_path gyp-win-tool manifest-to-rc \$arch \$dll.manifest \$
- # \$dll.manifest.rc 2 && $python_path gyp-win-tool rc-wrapper \$arch rc.exe \$
- # \$dll.manifest.rc && $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$
+ # manifest-wrapper environment.x86 cmd /c if exist \$dll.manifest del \$dll.manifest && \$
+ # $python_path gyp-win-tool manifest-wrapper environment.x86 mt.exe -nologo -manifest \$manifests \$
+ # -out:\$dll.manifest && $python_path gyp-win-tool manifest-to-rc environment.x86 \$dll.manifest \$
+ # \$dll.manifest.rc 2 && $python_path gyp-win-tool rc-wrapper environment.x86 rc.exe \$
+ # \$dll.manifest.rc && $python_path gyp-win-tool link-wrapper environment.x86 link.exe /nologo \$
# \$implibflag /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp \$dll.manifest.res
# description = LINK_EMBED_INC(DLL) \$dll
# restat = 1
@@ -88,54 +93,54 @@ toolchain("32") {
# rspfile_content = \$libs \$in_newline \$ldflags
#}
#rule link_embed_inc
- # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo /OUT:\$out \$
- # /PDB:\$out.pdb @\$out.rsp && $python_path gyp-win-tool manifest-wrapper \$arch cmd /c \$
+ # command = cmd /c $python_path gyp-win-tool link-wrapper environment.x86 link.exe /nologo /OUT:\$out \$
+ # /PDB:\$out.pdb @\$out.rsp && $python_path gyp-win-tool manifest-wrapper environment.x86 cmd /c \$
# if exist \$out.manifest del \$out.manifest && $python_path gyp-win-tool \$
- # manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests -out:\$out.manifest && \$
- # $python_path gyp-win-tool manifest-to-rc \$arch \$out.manifest \$out.manifest.rc 1 && \$
- # $python_path gyp-win-tool rc-wrapper \$arch rc.exe \$out.manifest.rc && \$
- # $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo /OUT:\$out /PDB:\$out.pdb \$
+ # manifest-wrapper environment.x86 mt.exe -nologo -manifest \$manifests -out:\$out.manifest && \$
+ # $python_path gyp-win-tool manifest-to-rc environment.x86 \$out.manifest \$out.manifest.rc 1 && \$
+ # $python_path gyp-win-tool rc-wrapper environment.x86 rc.exe \$out.manifest.rc && \$
+ # $python_path gyp-win-tool link-wrapper environment.x86 link.exe /nologo /OUT:\$out /PDB:\$out.pdb \$
# @\$out.rsp \$out.manifest.res
# description = LINK_EMBED_INC \$out
# rspfile = \$out.rsp
# rspfile_content = \$in_newline \$libs \$ldflags
#rule solink_embed
- # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag \$
+ # command = cmd /c $python_path gyp-win-tool link-wrapper environment.x86 link.exe /nologo \$implibflag \$
# /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool \$
- # manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && \$
- # $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests \$
+ # manifest-wrapper environment.x86 cmd /c if exist \$dll.manifest del \$dll.manifest && \$
+ # $python_path gyp-win-tool manifest-wrapper environment.x86 mt.exe -nologo -manifest \$manifests \$
# -outputresource:\$dll;2
# description = LINK_EMBED(DLL) \$dll
# restat = 1
# rspfile = \$dll.rsp
# rspfile_content = \$libs \$in_newline \$ldflags
#rule solink_module_embed
- # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag \$
+ # command = cmd /c $python_path gyp-win-tool link-wrapper environment.x86 link.exe /nologo \$implibflag \$
# /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool \$
- # manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && \$
- # $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests \$
+ # manifest-wrapper environment.x86 cmd /c if exist \$dll.manifest del \$dll.manifest && \$
+ # $python_path gyp-win-tool manifest-wrapper environment.x86 mt.exe -nologo -manifest \$manifests \$
# -outputresource:\$dll;2
# description = LINK_EMBED(DLL) \$dll
# restat = 1
# rspfile = \$dll.rsp
# rspfile_content = \$libs \$in_newline \$ldflags
#rule link_embed
- # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo /OUT:\$out \$
- # /PDB:\$out.pdb @\$out.rsp && $python_path gyp-win-tool manifest-wrapper \$arch cmd /c \$
+ # command = cmd /c $python_path gyp-win-tool link-wrapper environment.x86 link.exe /nologo /OUT:\$out \$
+ # /PDB:\$out.pdb @\$out.rsp && $python_path gyp-win-tool manifest-wrapper environment.x86 cmd /c \$
# if exist \$out.manifest del \$out.manifest && $python_path gyp-win-tool \$
- # manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests -outputresource:\$out;1
+ # manifest-wrapper environment.x86 mt.exe -nologo -manifest \$manifests -outputresource:\$out;1
# description = LINK_EMBED \$out
# rspfile = \$out.rsp
# rspfile_content = \$in_newline \$libs \$ldflags
tool("solink") {
- command = "cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests -out:\$dll.manifest"
+ command = "cmd /c $python_path gyp-win-tool link-wrapper environment.x86 link.exe /nologo \$implibflag /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool manifest-wrapper environment.x86 cmd /c if exist \$dll.manifest del \$dll.manifest && $python_path gyp-win-tool manifest-wrapper environment.x86 mt.exe -nologo -manifest \$manifests -out:\$dll.manifest"
description = "LINK(DLL) \$dll"
restat = "1"
rspfile = "\$dll.rsp"
rspfile_content = "\$libs \$in_newline \$ldflags"
}
tool("link") {
- command = "cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo /OUT:\$out /PDB:\$out.pdb @\$out.rsp && $python_path gyp-win-tool manifest-wrapper \$arch cmd /c if exist \$out.manifest del \$out.manifest && $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests -out:\$out.manifest"
+ command = "cmd /c $python_path gyp-win-tool link-wrapper environment.x86 link.exe /nologo /OUT:\$out /PDB:\$out.pdb @\$out.rsp && $python_path gyp-win-tool manifest-wrapper environment.x86 cmd /c if exist \$out.manifest del \$out.manifest && $python_path gyp-win-tool manifest-wrapper environment.x86 mt.exe -nologo -manifest \$manifests -out:\$out.manifest"
description = "LINK \$out"
rspfile = "\$out.rsp"
rspfile_content = "\$in_newline \$libs \$ldflags"
diff --git a/tools/gn/secondary/build/toolchain/win/setup_toolchain.py b/tools/gn/secondary/build/toolchain/win/setup_toolchain.py
new file mode 100644
index 0000000..bba18df
--- /dev/null
+++ b/tools/gn/secondary/build/toolchain/win/setup_toolchain.py
@@ -0,0 +1,72 @@
+# 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.
+
+import os
+import re
+import sys
+
+def ExtractImportantEnvironment():
+ """Extracts environment variables required for the toolchain from the
+ current environment."""
+ envvars_to_save = (
+ 'goma_.*', # TODO(scottmg): This is ugly, but needed for goma.
+ 'Path',
+ 'PATHEXT',
+ 'SystemRoot',
+ 'TEMP',
+ 'TMP',
+ )
+ result = {}
+ for envvar in envvars_to_save:
+ if envvar in os.environ:
+ if envvar == 'Path':
+ # Our own rules (for running gyp-win-tool) and other actions in
+ # Chromium rely on python being in the path. Add the path to this
+ # python here so that if it's not in the path when ninja is run
+ # later, python will still be found.
+ result[envvar.upper()] = os.path.dirname(sys.executable) + \
+ os.pathsep + os.environ[envvar]
+ else:
+ result[envvar.upper()] = os.environ[envvar]
+ for required in ('SYSTEMROOT', 'TEMP', 'TMP'):
+ if required not in result:
+ raise Exception('Environment variable "%s" '
+ 'required to be set to valid path' % required)
+ return result
+
+def FormatAsEnvironmentBlock(envvar_dict):
+ """Format as an 'environment block' directly suitable for CreateProcess.
+ Briefly this is a list of key=value\0, terminated by an additional \0. See
+ CreateProcess documentation for more details."""
+ block = ''
+ nul = '\0'
+ for key, value in envvar_dict.iteritems():
+ block += key + '=' + value + nul
+ block += nul
+ return block
+
+def CopyTool(source_path):
+ """Copies the given tool to the current directory, including a warning not
+ to edit it."""
+ with open(source_path) as source_file:
+ tool_source = source_file.readlines()
+
+ # Add header and write it out to the current directory (which should be the
+ # root build dir).
+ with open("gyp-win-tool", 'w') as tool_file:
+ tool_file.write(''.join([tool_source[0],
+ '# Generated by setup_toolchain.py do not edit.\n']
+ + tool_source[1:]))
+
+# Find the tool source, it's the first argument, and copy it.
+if len(sys.argv) != 2:
+ print "Need one argument (win_tool source path)."
+ sys.exit(1)
+CopyTool(sys.argv[1])
+
+# Write the environment file to the current directory.
+environ = FormatAsEnvironmentBlock(ExtractImportantEnvironment())
+with open('environment.x86', 'wb') as env_file:
+ env_file.write(environ)
+