diff options
author | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-22 21:59:55 +0000 |
---|---|---|
committer | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-22 21:59:55 +0000 |
commit | 12e400a10af6a47105c2294bb7b20084108eebe3 (patch) | |
tree | df6449f952bdda6bcd489d30269f335d100b3b70 | |
parent | b3c0ee731210b12a18adc0362212341218462b83 (diff) | |
download | chromium_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.cc | 4 | ||||
-rw-r--r-- | tools/gn/build_settings.h | 3 | ||||
-rw-r--r-- | tools/gn/ninja_binary_target_writer.cc | 2 | ||||
-rw-r--r-- | tools/gn/ninja_script_target_writer.cc | 2 | ||||
-rw-r--r-- | tools/gn/ninja_target_writer.cc | 6 | ||||
-rw-r--r-- | tools/gn/ninja_target_writer.h | 2 | ||||
-rw-r--r-- | tools/gn/secondary/build/config/win/BUILD.gn | 23 | ||||
-rw-r--r-- | tools/gn/secondary/build/toolchain/win/BUILD.gn | 77 | ||||
-rw-r--r-- | tools/gn/secondary/build/toolchain/win/setup_toolchain.py | 72 |
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) + |