diff options
Diffstat (limited to 'tools/cpp/wrapper/bin/pydir/msvc_cl.py')
-rw-r--r-- | tools/cpp/wrapper/bin/pydir/msvc_cl.py | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/tools/cpp/wrapper/bin/pydir/msvc_cl.py b/tools/cpp/wrapper/bin/pydir/msvc_cl.py new file mode 100644 index 0000000000..9a867f6d07 --- /dev/null +++ b/tools/cpp/wrapper/bin/pydir/msvc_cl.py @@ -0,0 +1,128 @@ +# pylint: disable=g-bad-file-header +# Copyright 2016 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Wrapper script for executing the Microsoft Compiler.""" +import os +import sys +import msvc_link +import msvc_tools + +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(SCRIPT_DIR) + +GCCPATTERNS = [ + ('-m(32|64)', ['$TARGET_ARCH']), + ('-Xcompilation-mode=(dbg|fastbuild|opt)', ['$COMPILATION_MODE']), + ('-msse', ['/arch:SSE']), + ('-msse2', ['/arch:SSE2']), + ('-c', ['/c']), + ('-D(.+)', ['/D$0']), + ('-U(.+)', ['/U$0']), + ('-E', ['/E']), + (('-o', '(.+)'), ['$COMPILE_OUTPUT0']), + ('-O0', ['/Od']), + ('-Os', ['/O1']), + ('-O2', ['/O2']), + ('-g', ['/MTd']), + ('-fexceptions', ['/U_HAS_EXCEPTIONS', '/D_HAS_EXCEPTIONS=1', '/EHsc']), + ('-fomit-frame-pointer', ['/Oy']), + ('-frandom-seed(.+)', []), + ('-fno-rtti', ['/GR-']), + ('-frtti', ['/GR']), + ('-fPIC', []), + + # This is unneeded for Windows. + (('-isystem', '(.*)'), ['/I$PATH0']), + (('-iquote', '(.*)'), ['/I$PATH0']), + ('-I(.+)', ['/I$PATH0']), + (('-include', '(.+)'), ['/FI$PATH0']), + ('-MD', []), + (('-MF', '(.+)'), ['$GENERATE_DEPS0']), + ('-w', ['/w']), + ('-Wall', ['/Wall']), + ('-Wsign-compare', ['/we4018']), + ('-Wno-sign-compare', ['/wd4018']), + ('-Wconversion', ['/we4244', '/we4267']), + ('-Wno-conversion', ['/wd4244', '/wd4267']), + ('-Wno-sign-conversion', []), + ('-Wno-implicit-fallthrough', []), + ('-Wno-implicit-function-declaration', []), + ('-Wcovered-switch-default', ['/we4062']), + ('-Wno-covered-switch-default', ['/wd4062']), + ('-Wno-error', []), + ('-Wno-invalid-offsetof', []), + ('-Wno-overloaded-virtual', []), + ('-Wno-reorder', []), + ('-Wno-string-plus-int', []), + ('-Wl,S', []), # Stripping is unnecessary since msvc uses pdb files. + ('-Wl,-rpath(.+)', []), + (('-x', r'c\+\+-header'), ['$CREATE_PRECOMPILED_HEADER']), + ('-B(.+)', []), + ('-static', []), + ('-shared', []), +] + + +def _IsLink(args): + """Determines whether we need to link rather than compile. + + A set of arguments is for linking if they contain -static, -shared, are adding + adding library search paths through -L, or libraries via -l. + + Args: + args: List of arguments + + Returns: + Boolean whether this is a link operation or not. + """ + for arg in args: + # Certain flags indicate we are linking. + if (arg in ['-shared', '-static'] or arg[:2] in ['-l', '-L'] or + arg[:3] == '-Wl'): + return True + return False + + +class MsvcCompiler(msvc_tools.WindowsRunner): + """Driver for the Microsoft compiler.""" + + def Run(self, argv): + """Runs the compiler using the passed clang/gcc style argument list. + + Args: + argv: List of arguments + + Returns: + The return code of the compilation. + + Raises: + ValueError: if target architecture isn't specified + """ + parser = msvc_tools.ArgParser(self, argv, GCCPATTERNS) + if not parser.target_arch: + raise ValueError('Must specify target architecture (-m32 or -m64)') + + return self.RunBinary('cl', parser.options, parser.target_arch, parser) + + +def main(argv): + # If we are supposed to link create a static library. + if _IsLink(argv[1:]): + return msvc_link.main(argv) + else: + return MsvcCompiler().Run(argv[1:]) + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) # need to skip the first argument |