From 1517d176e0b9aacb4002ebf94e86ff78d0ce24cd Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Wed, 11 Jan 2023 01:32:56 -0800 Subject: [PATCH] Enable `compiler_param_file` in Windows MSVC toolchain Fixes #5163 Closes #17135. PiperOrigin-RevId: 501212729 Change-Id: I6b4371a5521230c4c89f92321933b578bf5c3051 --- src/test/py/bazel/bazel_windows_cpp_test.py | 107 +++++++++++++------- tools/cpp/windows_cc_toolchain_config.bzl | 1 + 2 files changed, 73 insertions(+), 35 deletions(-) diff --git a/src/test/py/bazel/bazel_windows_cpp_test.py b/src/test/py/bazel/bazel_windows_cpp_test.py index 42a2ab75ca6739..fed0b1c51d2b5a 100644 --- a/src/test/py/bazel/bazel_windows_cpp_test.py +++ b/src/test/py/bazel/bazel_windows_cpp_test.py @@ -219,7 +219,7 @@ def testBuildCcBinaryFromDifferentPackage(self): ' name = "main",', ' srcs = ["main.cc"],', ' deps = ["//:B"],', - ' linkstatic = 0,' + ' linkstatic = 0,', ')', ]) bazel_bin = self.getBazelInfo('bazel-bin') @@ -247,7 +247,7 @@ def testBuildCcBinaryDependsOnConflictDLLs(self): ' name = "main",', ' srcs = ["main.cc"],', ' deps = ["//:B", "//lib:A"],', # Transitively depends on //:A - ' linkstatic = 0,' + ' linkstatic = 0,', ')', ]) bazel_bin = self.getBazelInfo('bazel-bin') @@ -278,14 +278,14 @@ def testBuildDifferentCcBinariesDependOnConflictDLLs(self): ' name = "main",', ' srcs = ["main.cc"],', ' deps = ["//:B"],', # Transitively depends on //:A - ' linkstatic = 0,' + ' linkstatic = 0,', ')', '', 'cc_binary(', ' name = "other_main",', ' srcs = ["other_main.cc"],', ' deps = ["//lib:A"],', - ' linkstatic = 0,' + ' linkstatic = 0,', ')', ]) bazel_bin = self.getBazelInfo('bazel-bin') @@ -386,24 +386,32 @@ def testDynamicLinkingMSVCRT(self): # By default, it should link to msvcrt dynamically. exit_code, _, stderr = self.RunBazel( ['build', '//:A', '--output_groups=dynamic_library', '-s']) - paramfile = os.path.join(bazel_output, - 'x64_windows-fastbuild/bin/A_0.dll-2.params') + compile_params = os.path.join( + bazel_output, 'x64_windows-fastbuild/bin/_objs/A/a.obj.params' + ) + link_params = os.path.join( + bazel_output, 'x64_windows-fastbuild/bin/A_0.dll-2.params' + ) self.AssertExitCode(exit_code, 0, stderr) - self.assertIn('/MD', ''.join(stderr)) - self.AssertFileContentContains(paramfile, '/DEFAULTLIB:msvcrt.lib') - self.assertNotIn('/MT', ''.join(stderr)) - self.AssertFileContentNotContains(paramfile, '/DEFAULTLIB:libcmt.lib') + self.AssertFileContentContains(compile_params, '/MD') + self.AssertFileContentContains(link_params, '/DEFAULTLIB:msvcrt.lib') + self.AssertFileContentNotContains(compile_params, '/MT') + self.AssertFileContentNotContains(link_params, '/DEFAULTLIB:libcmt.lib') # Test build in debug mode. exit_code, _, stderr = self.RunBazel( ['build', '-c', 'dbg', '//:A', '--output_groups=dynamic_library', '-s']) - paramfile = os.path.join(bazel_output, - 'x64_windows-dbg/bin/A_0.dll-2.params') + compile_params = os.path.join( + bazel_output, 'x64_windows-dbg/bin/_objs/A/a.obj.params' + ) + link_params = os.path.join( + bazel_output, 'x64_windows-dbg/bin/A_0.dll-2.params' + ) self.AssertExitCode(exit_code, 0, stderr) - self.assertIn('/MDd', ''.join(stderr)) - self.AssertFileContentContains(paramfile, '/DEFAULTLIB:msvcrtd.lib') - self.assertNotIn('/MTd', ''.join(stderr)) - self.AssertFileContentNotContains(paramfile, '/DEFAULTLIB:libcmtd.lib') + self.AssertFileContentContains(compile_params, '/MDd') + self.AssertFileContentContains(link_params, '/DEFAULTLIB:msvcrtd.lib') + self.AssertFileContentNotContains(compile_params, '/MTd') + self.AssertFileContentNotContains(link_params, '/DEFAULTLIB:libcmtd.lib') def testStaticLinkingMSVCRT(self): self.createProjectFiles() @@ -414,26 +422,34 @@ def testStaticLinkingMSVCRT(self): 'build', '//:A', '--output_groups=dynamic_library', '--features=static_link_msvcrt', '-s' ]) - paramfile = os.path.join(bazel_output, - 'x64_windows-fastbuild/bin/A_0.dll-2.params') + compile_params = os.path.join( + bazel_output, 'x64_windows-fastbuild/bin/_objs/A/a.obj.params' + ) + link_params = os.path.join( + bazel_output, 'x64_windows-fastbuild/bin/A_0.dll-2.params' + ) self.AssertExitCode(exit_code, 0, stderr) - self.assertNotIn('/MD', ''.join(stderr)) - self.AssertFileContentNotContains(paramfile, '/DEFAULTLIB:msvcrt.lib') - self.assertIn('/MT', ''.join(stderr)) - self.AssertFileContentContains(paramfile, '/DEFAULTLIB:libcmt.lib') + self.AssertFileContentNotContains(compile_params, '/MD') + self.AssertFileContentNotContains(link_params, '/DEFAULTLIB:msvcrt.lib') + self.AssertFileContentContains(compile_params, '/MT') + self.AssertFileContentContains(link_params, '/DEFAULTLIB:libcmt.lib') # Test build in debug mode. exit_code, _, stderr = self.RunBazel([ 'build', '-c', 'dbg', '//:A', '--output_groups=dynamic_library', '--features=static_link_msvcrt', '-s' ]) - paramfile = os.path.join(bazel_output, - 'x64_windows-dbg/bin/A_0.dll-2.params') + compile_params = os.path.join( + bazel_output, 'x64_windows-dbg/bin/_objs/A/a.obj.params' + ) + link_params = os.path.join( + bazel_output, 'x64_windows-dbg/bin/A_0.dll-2.params' + ) self.AssertExitCode(exit_code, 0, stderr) - self.assertNotIn('/MDd', ''.join(stderr)) - self.AssertFileContentNotContains(paramfile, '/DEFAULTLIB:msvcrtd.lib') - self.assertIn('/MTd', ''.join(stderr)) - self.AssertFileContentContains(paramfile, '/DEFAULTLIB:libcmtd.lib') + self.AssertFileContentNotContains(compile_params, '/MDd') + self.AssertFileContentNotContains(link_params, '/DEFAULTLIB:msvcrtd.lib') + self.AssertFileContentContains(compile_params, '/MTd') + self.AssertFileContentContains(link_params, '/DEFAULTLIB:libcmtd.lib') def testBuildSharedLibraryFromCcBinaryWithStaticLink(self): self.createProjectFiles() @@ -444,8 +460,8 @@ def testBuildSharedLibraryFromCcBinaryWithStaticLink(self): ' name = "main.dll",', ' srcs = ["main.cc"],', ' deps = ["//:B"],', # Transitively depends on //:A - ' linkstatic = 1,' - ' linkshared = 1,' + ' linkstatic = 1,', + ' linkshared = 1,', ' features=["windows_export_all_symbols"]', ')', ]) @@ -479,8 +495,8 @@ def testBuildSharedLibraryFromCcBinaryWithDynamicLink(self): ' name = "main.dll",', ' srcs = ["main.cc"],', ' deps = ["//:B"],', # Transitively depends on //:A - ' linkstatic = 0,' - ' linkshared = 1,' + ' linkstatic = 0,', + ' linkshared = 1,', ' features=["windows_export_all_symbols"]', ')', '', @@ -528,8 +544,8 @@ def testGetDefFileOfSharedLibraryFromCcBinary(self): ' name = "main.dll",', ' srcs = ["main.cc"],', ' deps = ["//:B"],', # Transitively depends on //:A - ' linkstatic = 1,' - ' linkshared = 1,' + ' linkstatic = 1,', + ' linkshared = 1,', ')', ]) bazel_bin = self.getBazelInfo('bazel-bin') @@ -681,7 +697,7 @@ def testCopyDLLAsSource(self): ' shared_library = "A.dll",', ' visibility = ["//:__subpackages__"],', ')', - '' + '', 'filegroup(', ' name = "bin_src",', ' srcs = ["bin.cc"],', @@ -1071,6 +1087,27 @@ def testBuildArm64CppBinaryWithMsvcCLAndCpuArm64Windows(self): self.AssertExitCode(exit_code, 0, stderr) self.assertIn('arm64\\cl.exe', ''.join(stderr)) + def testLongCompileCommandLines(self): + self.CreateWorkspaceWithDefaultRepos('WORKSPACE') + self.ScratchFile( + 'BUILD', + [ + 'cc_binary(', + ' name = "long",', + ' srcs = ["long.cc"],', + # Creates a command that is longer than 32767 characters, which is + # the maximum length of a command line on Windows. + ' includes = [str(i) + 450 * "a" for i in range(120)],', + ')', + ], + ) + self.ScratchFile('long.cc', ['int main() { return 0; }']) + + exit_code, _, stderr = self.RunBazel( + ['build', '--verbose_failures', '//:long'] + ) + self.AssertExitCode(exit_code, 0, stderr) + if __name__ == '__main__': unittest.main() diff --git a/tools/cpp/windows_cc_toolchain_config.bzl b/tools/cpp/windows_cc_toolchain_config.bzl index d913692b7e05d7..3ac914a948ee72 100644 --- a/tools/cpp/windows_cc_toolchain_config.bzl +++ b/tools/cpp/windows_cc_toolchain_config.bzl @@ -377,6 +377,7 @@ def _impl(ctx): compiler_param_file_feature = feature( name = "compiler_param_file", + enabled = True, ) copy_dynamic_libraries_to_binary_feature = feature(