diff --git a/util/BUILD.toplevel b/util/BUILD.toplevel index c3143894a..a855aa5a9 100644 --- a/util/BUILD.toplevel +++ b/util/BUILD.toplevel @@ -18,14 +18,7 @@ load( "crypto_headers", "crypto_internal_headers", "crypto_sources", - "crypto_sources_apple_aarch64", - "crypto_sources_apple_arm", - "crypto_sources_apple_x86", - "crypto_sources_apple_x86_64", - "crypto_sources_linux_aarch64", - "crypto_sources_linux_arm", - "crypto_sources_linux_x86", - "crypto_sources_linux_x86_64", + "crypto_sources_asm", "fips_fragments", "ssl_headers", "ssl_internal_headers", @@ -38,33 +31,47 @@ licenses(["notice"]) exports_files(["LICENSE"]) -[ - ( - config_setting( - name = os + "_" + arch, - constraint_values = [ - "@platforms//os:" + os, - "@platforms//cpu:" + arch, - ], - ), - ) - for os in [ - "linux", - "android", - "macos", - "ios", - "tvos", - "watchos", - ] - for arch in [ - "arm64", - "armv7", - "x86_64", - "x86_32", - ] -] +# By default, the C files will expect assembly files, if any, to be linked in +# with the build. This default can be flipped with -DOPENSSL_NO_ASM. If building +# in a configuration where we have no assembly optimizations, -DOPENSSL_NO_ASM +# has no effect, and either value is fine. +# +# Like C files, assembly files are wrapped in #ifdef (or NASM equivalent), so it +# is safe to include a file for the wrong platform in the build. It will just +# output an empty object file. However, we need some platform selectors to +# distinguish between gas or NASM syntax. +# +# For all non-Windows platforms, we use gas assembly syntax and can assume any +# GCC-compatible toolchain includes a gas-compatible assembler. +# +# For Windows, we use NASM on x86 and x86_64 and gas, specifically +# clang-assembler, on aarch64. We have not yet added NASM support to this build, +# and would need to detect MSVC vs clang-cl for aarch64 so, for now, we just +# disable assembly on Windows across the board. +# +# These two selects for asm_sources and asm_copts must be kept in sync. If we +# specify assembly, we don't want OPENSSL_NO_ASM. If we don't specify assembly, +# we want OPENSSL_NO_ASM, in case the C files expect them in some format (e.g. +# NASM) this build file doesn't yet support. +# +# TODO(https://crbug.com/boringssl/531): Enable assembly for Windows. +asm_sources = select({ + "@platforms//os:windows": [], + "//conditions:default": crypto_sources_asm, +}) +asm_copts = select({ + "@platforms//os:windows": ["-DOPENSSL_NO_ASM"], + "//conditions:default": [], +}) -posix_copts = [ +# Configure C, C++, and common flags for GCC-compatible toolchains. +# +# TODO(davidben): Can we remove some of these? In Bazel, are warnings the +# toolchain or project's responsibility? -Wa,--noexecstack should be unnecessary +# now, though https://crbug.com/boringssl/292 tracks testing this in CI. +# -fno-common did not become default until +# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85678. +gcc_copts = [ # Assembler option --noexecstack adds .note.GNU-stack to each object to # ensure that binaries can be built with non-executable stack. "-Wa,--noexecstack", @@ -79,119 +86,51 @@ posix_copts = [ "-Wshadow", "-fno-common", ] - -glibc_copts = posix_copts + [ - # This is needed on glibc systems (at least) to get rwlock in pthread, but - # it should not be set on Apple platforms or FreeBSD, where it instead - # disables APIs we use. - # See compat(5), sys/cdefs.h, and https://crbug.com/boringssl/471 - "-D_XOPEN_SOURCE=700", -] - -boringssl_copts = select({ - "@platforms//os:linux": glibc_copts, - "@platforms//os:android": posix_copts, - "@platforms//os:macos": posix_copts, - "@platforms//os:ios": posix_copts, - "@platforms//os:tvos": posix_copts, - "@platforms//os:watchos": posix_copts, - "@platforms//os:windows": ["-DWIN32_LEAN_AND_MEAN"], - "//conditions:default": [], -}) - -# These selects must be kept in sync. -crypto_sources_asm = select({ - ":linux_armv7": crypto_sources_linux_arm, - ":linux_arm64": crypto_sources_linux_aarch64, - ":linux_x86_32": crypto_sources_linux_x86, - ":linux_x86_64": crypto_sources_linux_x86_64, - ":android_armv7": crypto_sources_linux_arm, - ":android_arm64": crypto_sources_linux_aarch64, - ":android_x86_32": crypto_sources_linux_x86, - ":android_x86_64": crypto_sources_linux_x86_64, - ":macos_armv7": crypto_sources_apple_arm, - ":macos_arm64": crypto_sources_apple_aarch64, - ":macos_x86_32": crypto_sources_apple_x86, - ":macos_x86_64": crypto_sources_apple_x86_64, - ":ios_armv7": crypto_sources_apple_arm, - ":ios_arm64": crypto_sources_apple_aarch64, - ":ios_x86_32": crypto_sources_apple_x86, - ":ios_x86_64": crypto_sources_apple_x86_64, - ":tvos_armv7": crypto_sources_apple_arm, - ":tvos_arm64": crypto_sources_apple_aarch64, - ":tvos_x86_32": crypto_sources_apple_x86, - ":tvos_x86_64": crypto_sources_apple_x86_64, - ":watchos_armv7": crypto_sources_apple_arm, - ":watchos_arm64": crypto_sources_apple_aarch64, - ":watchos_x86_32": crypto_sources_apple_x86, - ":watchos_x86_64": crypto_sources_apple_x86_64, - "//conditions:default": [], -}) -boringssl_copts += select({ - ":linux_armv7": [], - ":linux_arm64": [], - ":linux_x86_32": [], - ":linux_x86_64": [], - ":android_armv7": [], - ":android_arm64": [], - ":android_x86_32": [], - ":android_x86_64": [], - ":macos_armv7": [], - ":macos_arm64": [], - ":macos_x86_32": [], - ":macos_x86_64": [], - ":ios_armv7": [], - ":ios_arm64": [], - ":ios_x86_32": [], - ":ios_x86_64": [], - ":tvos_armv7": [], - ":tvos_arm64": [], - ":tvos_x86_32": [], - ":tvos_x86_64": [], - ":watchos_armv7": [], - ":watchos_arm64": [], - ":watchos_x86_32": [], - ":watchos_x86_64": [], - "//conditions:default": ["-DOPENSSL_NO_ASM"], -}) - -# For C targets only (not C++), compile with C11 support. -posix_copts_c11 = [ +gcc_copts_c11 = [ "-std=c11", "-Wmissing-prototypes", "-Wold-style-definition", "-Wstrict-prototypes", ] - -boringssl_copts_c11 = boringssl_copts + select({ - "@platforms//os:linux": posix_copts_c11, - "@platforms//os:android": posix_copts_c11, - "@platforms//os:macos": posix_copts_c11, - "@platforms//os:ios": posix_copts_c11, - "@platforms//os:tvos": posix_copts_c11, - "@platforms//os:watchos": posix_copts_c11, - "//conditions:default": [], -}) - -# For C++ targets only (not C), compile with C++14 support. -posix_copts_cxx = [ +gcc_copts_cxx = [ "-std=c++14", "-Wmissing-declarations", ] -boringssl_copts_cxx = boringssl_copts + select({ - "@platforms//os:linux": posix_copts_cxx, - "@platforms//os:android": posix_copts_cxx, - "@platforms//os:macos": posix_copts_cxx, - "@platforms//os:ios": posix_copts_cxx, - "@platforms//os:tvos": posix_copts_cxx, - "@platforms//os:watchos": posix_copts_cxx, +boringssl_copts = select({ + # We assume that non-Windows builds use a GCC-compatible toolchain and that + # Windows builds do not. + # + # TODO(davidben): Should these be querying something in @bazel_tools? + # Unfortunately, @bazel_tools is undocumented. See + # https://github.com/bazelbuild/bazel/issues/14914 + "@platforms//os:windows": [], + "//conditions:default": gcc_copts, +}) + select({ + # This is needed on glibc systems to get rwlock in pthreads, but it should + # not be set on Apple platforms or FreeBSD, where it instead disables APIs + # we use. + # See compat(5), sys/cdefs.h, and https://crbug.com/boringssl/471 + "@platforms//os:linux": ["-D_XOPEN_SOURCE=700"], + # Without WIN32_LEAN_AND_MEAN, pulls in wincrypt.h, which + # conflicts with our . + "@platforms//os:windows": ["-DWIN32_LEAN_AND_MEAN"], "//conditions:default": [], +}) + asm_copts + +boringssl_copts_c11 = boringssl_copts + select({ + "@platforms//os:windows": [], + "//conditions:default": gcc_copts_c11, +}) + +boringssl_copts_cxx = boringssl_copts + select({ + "@platforms//os:windows": [], + "//conditions:default": gcc_copts_cxx, }) cc_library( name = "crypto", - srcs = crypto_sources + crypto_internal_headers + crypto_sources_asm, + srcs = crypto_sources + crypto_internal_headers + asm_sources, hdrs = crypto_headers + fips_fragments, copts = boringssl_copts_c11, includes = ["src/include"], diff --git a/util/generate_build_files.py b/util/generate_build_files.py index 383de02d2..0cabe9c2b 100644 --- a/util/generate_build_files.py +++ b/util/generate_build_files.py @@ -255,6 +255,23 @@ class Bazel(object): self.PrintVariableSection( out, 'crypto_sources_%s_%s' % (osname, arch), asm_files) + # Generate combined source lists for gas and nasm. Consumers have a choice + # of using the per-platform ones or the combined ones. In the combined + # mode, Windows x86 and Windows x86_64 must still be special-cased, but + # otherwise all assembly files can be linked together. + out.write('\n') + out.write('crypto_sources_asm = []\n') + for (osname, arch, _, _, asm_ext) in OS_ARCH_COMBOS: + if asm_ext == 'S': + out.write('crypto_sources_asm.extend(crypto_sources_%s_%s)\n' % + (osname, arch)) + out.write('\n') + out.write('crypto_sources_nasm = []\n') + for (osname, arch, _, _, asm_ext) in OS_ARCH_COMBOS: + if asm_ext == 'asm': + out.write('crypto_sources_nasm.extend(crypto_sources_%s_%s)\n' % + (osname, arch)) + with open('BUILD.generated_tests.bzl', 'w+') as out: out.write(self.header)