MSVC toolchain changes for building TensorFlow
--
Change-Id: If41817e3889f118a849a29cfb03ac0f7e07d5557
Reviewed-on: https://bazel-review.googlesource.com/#/c/3582
MOS_MIGRATED_REVID=121924420
diff --git a/tools/cpp/CROSSTOOL b/tools/cpp/CROSSTOOL
index 34c6e85..74a8d4e 100644
--- a/tools/cpp/CROSSTOOL
+++ b/tools/cpp/CROSSTOOL
@@ -563,7 +563,10 @@
target_libc: "msvcrt140"
default_python_version: "python2.7"
cxx_builtin_include_directory: "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/INCLUDE"
- cxx_builtin_include_directory: "C:/Program Files (x86)/Windows Kits/10/include/10.0.10240.0/ucrt"
+ cxx_builtin_include_directory: "C:/Program Files (x86)/Windows Kits/10/include/"
+ cxx_builtin_include_directory: "C:/Program Files (x86)/Windows Kits/8.1/include/"
+ cxx_builtin_include_directory: "C:/Program Files (x86)/GnuWin32/include/"
+ cxx_builtin_include_directory: "C:/python_27_amd64/files/include"
tool_path {
name: "ar"
path: "wrapper/bin/msvc_link.bat"
@@ -609,7 +612,7 @@
needsPic: false
compiler_flag: "-m64"
-
+ compiler_flag: "/D__inline__=__inline"
# TODO(pcloudy): Review those flags below, they should be defined by cl.exe
compiler_flag: "/DOS_WINDOWS=OS_WINDOWS"
compiler_flag: "/DCOMPILER_MSVC"
@@ -620,26 +623,17 @@
compiler_flag: "/DNOMINMAX"
compiler_flag: "/DPRAGMA_SUPPORTED"
# Platform defines.
- compiler_flag: "/D_WIN32"
- compiler_flag: "/DWIN32"
- compiler_flag: "/D_WIN32_WINNT=0x0502"
- compiler_flag: "/DWINVER=0x0502"
- compiler_flag: "/D_MSC_VER=1900"
- compiler_flag: "/D_WINDOWS"
+ compiler_flag: "/D_WIN32_WINNT=0x0600"
# Turn off warning messages.
compiler_flag: "/D_CRT_SECURE_NO_DEPRECATE"
compiler_flag: "/D_CRT_SECURE_NO_WARNINGS"
compiler_flag: "/D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS"
# Use math constants (M_PI, etc.) from the math library
compiler_flag: "/D_USE_MATH_DEFINES"
- # Don't bloat namespace with incompatible winsock versions.
- compiler_flag: "/DWIN32_LEAN_AND_MEAN"
# Useful options to have on for compilation.
# Suppress startup banner.
compiler_flag: "/nologo"
- # Treat warnings as errors.
- compiler_flag: "/WX"
# Increase the capacity of object files to 2^32 sections.
compiler_flag: "/bigobj"
# Allocate 500MB for precomputed headers.
diff --git a/tools/cpp/wrapper/bin/pydir/msvc_cl.py b/tools/cpp/wrapper/bin/pydir/msvc_cl.py
index 9a867f6..b8d4c8a 100644
--- a/tools/cpp/wrapper/bin/pydir/msvc_cl.py
+++ b/tools/cpp/wrapper/bin/pydir/msvc_cl.py
@@ -34,6 +34,7 @@
('-O0', ['/Od']),
('-Os', ['/O1']),
('-O2', ['/O2']),
+ ('-g0', []),
('-g', ['/MTd']),
('-fexceptions', ['/U_HAS_EXCEPTIONS', '/D_HAS_EXCEPTIONS=1', '/EHsc']),
('-fomit-frame-pointer', ['/Oy']),
@@ -71,6 +72,7 @@
('-B(.+)', []),
('-static', []),
('-shared', []),
+ ('-std=(.+)', []),
]
diff --git a/tools/cpp/wrapper/bin/pydir/msvc_link.py b/tools/cpp/wrapper/bin/pydir/msvc_link.py
index 8c61fcb..e081ab6 100644
--- a/tools/cpp/wrapper/bin/pydir/msvc_link.py
+++ b/tools/cpp/wrapper/bin/pydir/msvc_link.py
@@ -15,6 +15,7 @@
"""Wrapper script for executing the Microsoft Linker."""
import os
+import shutil
import sys
import msvc_tools
@@ -28,6 +29,7 @@
(('rcs.*', '(.+)'), ['/OUT:$PATH0']),
(('-o', '(.+)'), ['/OUT:$PATH0']),
('-B(.+)', []),
+ ('-lpthread', []),
('-l(.+)', ['lib$0.so']),
('-L(.+)', ['/LIBPATH:$PATH0']),
('-static', []),
@@ -68,9 +70,14 @@
# Find the output file name.
name = ''
+ self.output_dll_file = None
for arg in parser.options:
if '/OUT:' in arg:
name = arg[5:]
+ # if output file ends with .so.exe, we generate dll library.
+ if name.endswith('.so.exe'):
+ default_args.append('/DLL')
+ self.output_dll_file = os.path.normpath(name[0:-7])
break
if not name:
raise msvc_tools.Error('No output file name specified!')
@@ -116,8 +123,12 @@
else:
default_args.insert(0, 'libcmt.lib')
- return self.RunBinary(tool, default_args + parser.options,
- parser.target_arch, parser)
+ ret_code = self.RunBinary(tool, default_args + parser.options,
+ parser.target_arch, parser)
+ if not ret_code and self.output_dll_file:
+ shutil.copyfile(self.output_dll_file + '.so.exe',
+ self.output_dll_file + '.dll')
+ return ret_code
def main(argv):
diff --git a/tools/cpp/wrapper/bin/pydir/msvc_tools.py b/tools/cpp/wrapper/bin/pydir/msvc_tools.py
index 6e1f07c..9d3162b 100644
--- a/tools/cpp/wrapper/bin/pydir/msvc_tools.py
+++ b/tools/cpp/wrapper/bin/pydir/msvc_tools.py
@@ -32,6 +32,8 @@
PLATFORM_SDK_PATH = 'C:\\Program Files (x86)\\Windows Kits'
PLATFORM_SDK_VERSION = '10.0.10240.0'
TMP_PATH = 'C:\\Windows\\Temp'
+PYTHON_PATH = 'C:\\python_27_amd64\\files'
+GNU_PATH = 'C:\\Program Files (x86)\\GnuWin32'
class Error(Exception):
@@ -339,6 +341,8 @@
path = x86_paths if build_arch == 'x86' else x64_paths
include = [
+ os.path.join(GNU_PATH, 'include'),
+ os.path.join(PYTHON_PATH, 'include'),
os.path.join(VC_PATH, 'VC\\INCLUDE'),
os.path.join(VC_PATH, 'VC\\ATLMFC\\INCLUDE'),
os.path.join(PLATFORM_SDK_PATH, '10\\include', PLATFORM_SDK_VERSION,
@@ -350,29 +354,39 @@
os.path.join(PLATFORM_SDK_PATH, 'NETFXSDK\\4.6.1\\include\\um'),
]
+ common_lib_paths = [
+ os.path.join(GNU_PATH, 'bin'),
+ os.path.join(GNU_PATH, 'lib'),
+ os.path.join(PYTHON_PATH, 'libs'),
+ ]
+
x86_lib_path = [
os.path.join(VC_PATH, 'VC\\bin'),
os.path.join(VC_PATH, 'VC\\LIB'),
os.path.join(VC_PATH, 'VC\\ATLMFC\\LIB'),
- os.path.join(VC_PATH,
- 'VC\\redist\\x86\\Microsoft.VC' + VC_VERSION + '.CRT'),
+ os.path.join(VC_PATH, 'VC\\redist\\x86\\Microsoft.VC' + VC_VERSION +
+ '.CRT'),
os.path.join(PLATFORM_SDK_PATH, '10\\lib', PLATFORM_SDK_VERSION,
'ucrt\\x86'),
os.path.join(PLATFORM_SDK_PATH, '8.1\\lib\\winv6.3\\um\\x86'),
os.path.join(PLATFORM_SDK_PATH, 'NETFXSDK\\4.6.1\\lib\\um\\x86'),
- ]
+ os.path.join(GNU_PATH, 'bin\\x86'),
+ os.path.join(GNU_PATH, 'lib\\x86'),
+ ] + common_lib_paths
x64_lib_path = [
os.path.join(VC_PATH, 'VC\\bin\\x86_amd64'),
os.path.join(VC_PATH, 'VC\\LIB\\amd64'),
os.path.join(VC_PATH, 'VC\\ATLMFC\\LIB\\amd64'),
- os.path.join(VC_PATH,
- 'VC\\redist\\x64\\Microsoft.VC' + VC_VERSION + '.CRT'),
+ os.path.join(VC_PATH, 'VC\\redist\\x64\\Microsoft.VC' + VC_VERSION +
+ '.CRT'),
os.path.join(PLATFORM_SDK_PATH, '10\\lib', PLATFORM_SDK_VERSION,
'ucrt\\x64'),
os.path.join(PLATFORM_SDK_PATH, '8.1\\lib\\winv6.3\\um\\x64'),
os.path.join(PLATFORM_SDK_PATH, 'NETFXSDK\\4.6.1\\lib\\um\\x64'),
- ]
+ os.path.join(GNU_PATH, 'bin\\x64'),
+ os.path.join(GNU_PATH, 'lib\\x64'),
+ ] + common_lib_paths
lib = x86_lib_path if build_arch == 'x86' else x64_lib_path
@@ -403,6 +417,8 @@
'.*warning LNK4044: unrecognized option \'/link\'; ignored.*\n',
'.*warning LNK4221: This object file does not define any '
'previously.*\n',
+ # Comment the following line if you want to see warning messages
+ '.*warning C.*\n',
'\r\n',
'\n\r',
]
@@ -443,6 +459,8 @@
else:
cmd = [binary] + args
# Save stderr output to a temporary in case we need it.
+ # Unconmment the following line to see what exact command is executed.
+ # print "Running: " + " ".join(cmd)
proc = subprocess.Popen(cmd,
env=build_env,
stdout=subprocess.PIPE,