# This code is heavily based on the implementation in `dbx_build_tools`: # Ref: https://github.com/dropbox/dbx_build_tools/blob/master/thirdparty/openssl/BUILD.openssl.tail load("@bazel_skylib//rules:copy_file.bzl", "copy_file") load("@bazel_skylib//rules:write_file.bzl", "write_file") load("@openssl-generated-overlay//:collate_into_directory.bzl", "collate_into_directory") load( "@openssl-generated-overlay//:constants-darwin64-arm64-cc.bzl", _DARWIN_ARM64_COMMON_GENERATED_FILES = "COMMON_GENERATED_FILES", _DARWIN_ARM64_GEN_FILES = "GEN_FILES", _DARWIN_ARM64_LIBCRYPTO_DEFINES = "LIBCRYPTO_DEFINES", _DARWIN_ARM64_LIBCRYPTO_HDRS = "LIBCRYPTO_HDRS", _DARWIN_ARM64_LIBCRYPTO_SRCS = "LIBCRYPTO_SRCS", _DARWIN_ARM64_LIBSSL_DEFINES = "LIBSSL_DEFINES", _DARWIN_ARM64_LIBSSL_HDRS = "LIBSSL_HDRS", _DARWIN_ARM64_LIBSSL_SRCS = "LIBSSL_SRCS", _DARWIN_ARM64_OPENSSL_APP_DEFINES = "LIBSSL_DEFINES", _DARWIN_ARM64_OPENSSL_APP_HDRS = "OPENSSL_APP_HDRS", _DARWIN_ARM64_OPENSSL_APP_SRCS = "OPENSSL_APP_SRCS", _DARWIN_ARM64_OPENSSL_DEFINES = "OPENSSL_DEFINES", _NIX_ARM64_PERLASM_GEN = "PERLASM_GEN", ) load( "@openssl-generated-overlay//:constants-darwin64-x86_64-cc.bzl", _DARWIN_X86_64_COMMON_GENERATED_FILES = "COMMON_GENERATED_FILES", _DARWIN_X86_64_GEN_FILES = "GEN_FILES", _DARWIN_X86_64_LIBCRYPTO_DEFINES = "LIBCRYPTO_DEFINES", _DARWIN_X86_64_LIBCRYPTO_HDRS = "LIBCRYPTO_HDRS", _DARWIN_X86_64_LIBCRYPTO_SRCS = "LIBCRYPTO_SRCS", _DARWIN_X86_64_LIBSSL_DEFINES = "LIBSSL_DEFINES", _DARWIN_X86_64_LIBSSL_HDRS = "LIBSSL_HDRS", _DARWIN_X86_64_LIBSSL_SRCS = "LIBSSL_SRCS", _DARWIN_X86_64_OPENSSL_APP_DEFINES = "LIBSSL_DEFINES", _DARWIN_X86_64_OPENSSL_APP_HDRS = "OPENSSL_APP_HDRS", _DARWIN_X86_64_OPENSSL_APP_SRCS = "OPENSSL_APP_SRCS", _DARWIN_X86_64_OPENSSL_DEFINES = "OPENSSL_DEFINES", ) load( "@openssl-generated-overlay//:constants-linux-aarch64.bzl", _LINUX_ARM64_COMMON_GENERATED_FILES = "COMMON_GENERATED_FILES", _LINUX_ARM64_GEN_FILES = "GEN_FILES", _LINUX_ARM64_LIBCRYPTO_DEFINES = "LIBCRYPTO_DEFINES", _LINUX_ARM64_LIBCRYPTO_HDRS = "LIBCRYPTO_HDRS", _LINUX_ARM64_LIBCRYPTO_SRCS = "LIBCRYPTO_SRCS", _LINUX_ARM64_LIBSSL_DEFINES = "LIBSSL_DEFINES", _LINUX_ARM64_LIBSSL_HDRS = "LIBSSL_HDRS", _LINUX_ARM64_LIBSSL_SRCS = "LIBSSL_SRCS", _LINUX_ARM64_OPENSSL_APP_DEFINES = "LIBSSL_DEFINES", _LINUX_ARM64_OPENSSL_APP_HDRS = "OPENSSL_APP_HDRS", _LINUX_ARM64_OPENSSL_APP_SRCS = "OPENSSL_APP_SRCS", _LINUX_ARM64_OPENSSL_DEFINES = "OPENSSL_DEFINES", ) load( "@openssl-generated-overlay//:constants-linux-x86_64-clang.bzl", _LINUX_X86_64_COMMON_GENERATED_FILES = "COMMON_GENERATED_FILES", _LINUX_X86_64_GEN_FILES = "GEN_FILES", _LINUX_X86_64_LIBCRYPTO_DEFINES = "LIBCRYPTO_DEFINES", _LINUX_X86_64_LIBCRYPTO_HDRS = "LIBCRYPTO_HDRS", _LINUX_X86_64_LIBCRYPTO_SRCS = "LIBCRYPTO_SRCS", _LINUX_X86_64_LIBSSL_DEFINES = "LIBSSL_DEFINES", _LINUX_X86_64_LIBSSL_HDRS = "LIBSSL_HDRS", _LINUX_X86_64_LIBSSL_SRCS = "LIBSSL_SRCS", _LINUX_X86_64_OPENSSL_APP_DEFINES = "LIBSSL_DEFINES", _LINUX_X86_64_OPENSSL_APP_HDRS = "OPENSSL_APP_HDRS", _LINUX_X86_64_OPENSSL_APP_SRCS = "OPENSSL_APP_SRCS", _LINUX_X86_64_OPENSSL_DEFINES = "OPENSSL_DEFINES", _NIX_X86_64_PERLASM_GEN = "PERLASM_GEN", ) load( "@openssl-generated-overlay//:constants-VC-WIN64-CLANGASM-ARM.bzl", _WINDOWS_ARM64_COMMON_GENERATED_FILES = "COMMON_GENERATED_FILES", _WINDOWS_ARM64_GEN_FILES = "GEN_FILES", _WINDOWS_ARM64_LIBCRYPTO_DEFINES = "LIBCRYPTO_DEFINES", _WINDOWS_ARM64_LIBCRYPTO_HDRS = "LIBCRYPTO_HDRS", _WINDOWS_ARM64_LIBCRYPTO_SRCS = "LIBCRYPTO_SRCS", _WINDOWS_ARM64_LIBSSL_DEFINES = "LIBSSL_DEFINES", _WINDOWS_ARM64_LIBSSL_HDRS = "LIBSSL_HDRS", _WINDOWS_ARM64_LIBSSL_SRCS = "LIBSSL_SRCS", _WINDOWS_ARM64_OPENSSL_APP_DEFINES = "LIBSSL_DEFINES", _WINDOWS_ARM64_OPENSSL_APP_HDRS = "OPENSSL_APP_HDRS", _WINDOWS_ARM64_OPENSSL_APP_SRCS = "OPENSSL_APP_SRCS", _WINDOWS_ARM64_OPENSSL_DEFINES = "OPENSSL_DEFINES", _WINDOWS_ARM64_PERLASM_GEN = "PERLASM_GEN", ) load( "@openssl-generated-overlay//:constants-VC-WIN64A-masm.bzl", _WINDOWS_X86_64_COMMON_GENERATED_FILES = "COMMON_GENERATED_FILES", _WINDOWS_X86_64_GEN_FILES = "GEN_FILES", _WINDOWS_X86_64_LIBCRYPTO_DEFINES = "LIBCRYPTO_DEFINES", _WINDOWS_X86_64_LIBCRYPTO_HDRS = "LIBCRYPTO_HDRS", _WINDOWS_X86_64_LIBCRYPTO_SRCS = "LIBCRYPTO_SRCS", _WINDOWS_X86_64_LIBSSL_DEFINES = "LIBSSL_DEFINES", _WINDOWS_X86_64_LIBSSL_HDRS = "LIBSSL_HDRS", _WINDOWS_X86_64_LIBSSL_SRCS = "LIBSSL_SRCS", _WINDOWS_X86_64_OPENSSL_APP_DEFINES = "LIBSSL_DEFINES", _WINDOWS_X86_64_OPENSSL_APP_HDRS = "OPENSSL_APP_HDRS", _WINDOWS_X86_64_OPENSSL_APP_SRCS = "OPENSSL_APP_SRCS", _WINDOWS_X86_64_OPENSSL_DEFINES = "OPENSSL_DEFINES", _WINDOWS_X86_64_PERLASM_GEN = "PERLASM_GEN", ) load("@openssl-generated-overlay//:perl_genrule.bzl", "perl_genrule") load("@rules_cc//cc:cc_binary.bzl", "cc_binary") load("@rules_cc//cc:cc_library.bzl", "cc_library") load("//:utils.bzl", "get_repo_name", "parse_perlasm_gen", "remove_dupes") DARWIN_ARM64_COMMON_GENERATED_FILES = { src: "@openssl-generated-overlay//:{}".format(src) for src in _DARWIN_ARM64_COMMON_GENERATED_FILES } DARWIN_X86_64_COMMON_GENERATED_FILES = { src: "@openssl-generated-overlay//:{}".format(src) for src in _DARWIN_X86_64_COMMON_GENERATED_FILES } LINUX_ARM64_COMMON_GENERATED_FILES = { src: "@openssl-generated-overlay//:{}".format(src) for src in _LINUX_ARM64_COMMON_GENERATED_FILES } LINUX_X86_64_COMMON_GENERATED_FILES = { src: "@openssl-generated-overlay//:{}".format(src) for src in _LINUX_X86_64_COMMON_GENERATED_FILES } WINDOWS_ARM64_COMMON_GENERATED_FILES = { src: "@openssl-generated-overlay//:{}".format(src) for src in _WINDOWS_ARM64_COMMON_GENERATED_FILES } WINDOWS_X86_64_COMMON_GENERATED_FILES = { src: "@openssl-generated-overlay//:{}".format(src) for src in _WINDOWS_X86_64_COMMON_GENERATED_FILES } _COMMON_GENERATED_FILES_COMBINED = ( DARWIN_ARM64_COMMON_GENERATED_FILES | DARWIN_X86_64_COMMON_GENERATED_FILES | LINUX_ARM64_COMMON_GENERATED_FILES | LINUX_X86_64_COMMON_GENERATED_FILES | WINDOWS_ARM64_COMMON_GENERATED_FILES | WINDOWS_X86_64_COMMON_GENERATED_FILES ).keys() _REPO_NAME = get_repo_name() CRYPTO_TEXTUAL_HDRS = [ "crypto/des/ncbc_enc.c", ] + glob( # There are some .c files that are conditionally included textually, we want them to be # available include = ["providers/implementations/**/*.c"], exclude = _COMMON_GENERATED_FILES_COMBINED, ) + select({ "@platforms//os:windows": [ "crypto/LPdir_win.c", "crypto/LPdir_win32.c", "crypto/LPdir_wince.c", "engines/e_capi_err.c", "ms/applink.c", "ms/uplink.h", ], "//conditions:default": ["crypto/LPdir_unix.c"], }) COMMON_OPENSSL_APP_HDRS = glob( include = [ "apps/*.h", "apps/include/*.h", "include/internal/*.h", "include/openssl/*.h", ], exclude = _COMMON_GENERATED_FILES_COMBINED, ) # Some source files are missing from OpenSSL metadata so we never pick them up. MISSING_OPENSSL_WINDOWS_SRCS = ["apps/lib/win32_init.c"] ALL_OPENSSL_APP_HDRS = COMMON_OPENSSL_APP_HDRS + select({ "//configs:darwin_arm64": _DARWIN_ARM64_OPENSSL_APP_HDRS, "//configs:darwin_x86_64": _DARWIN_X86_64_OPENSSL_APP_HDRS, "//configs:linux_aarch64": _LINUX_ARM64_OPENSSL_APP_HDRS, "//configs:linux_x86_64": _LINUX_X86_64_OPENSSL_APP_HDRS, "//configs:windows_arm64": _WINDOWS_ARM64_OPENSSL_APP_HDRS, "//configs:windows_x64": _WINDOWS_X86_64_OPENSSL_APP_HDRS, }) ALL_OPENSSL_APP_SRCS = select({ "//configs:darwin_arm64": _DARWIN_ARM64_OPENSSL_APP_SRCS, "//configs:darwin_x86_64": _DARWIN_X86_64_OPENSSL_APP_SRCS, "//configs:linux_aarch64": _LINUX_ARM64_OPENSSL_APP_SRCS, "//configs:linux_x86_64": _LINUX_X86_64_OPENSSL_APP_SRCS, "//configs:windows_arm64": _WINDOWS_ARM64_OPENSSL_APP_SRCS + MISSING_OPENSSL_WINDOWS_SRCS, "//configs:windows_x64": _WINDOWS_X86_64_OPENSSL_APP_SRCS + MISSING_OPENSSL_WINDOWS_SRCS, }) OPENSSL_APP_NIX_COPTS = [ ] OPENSSL_APP_WINDOWS_COPTS = [ ] OPENSSL_APP_INCLUDES = [ "apps", "apps/include", ] OPENSSL_APP_NIX_LINKOPTS = [ ] OPENSSL_APP_WINDOWS_LINKOPTS = [ "-defaultlib:ws2_32.lib", "-defaultlib:advapi32.lib", "-defaultlib:user32.lib", "-defaultlib:crypt32.lib", ] COMMON_OPENSSL_WINDOWS_DEFINES = [ "_WINSOCKAPI_", "OPENSSL_SYS_WINCE", "WIN32_LEAN_AND_MEAN", ] COMMON_OPENSSL_DEFINES = select({ "//configs:windows_arm64": COMMON_OPENSSL_WINDOWS_DEFINES, "//configs:windows_x64": COMMON_OPENSSL_WINDOWS_DEFINES, "//conditions:default": [], }) COMMON_OPENSSL_COPTS = [ # This hardcoded path into the system mean we will find the system certs. Note Debian sets # OPENSSLDIR=/usr/lib/ssl, but /usr/lib/ssl mostly consists of symlinks into /etc/ssl. We # must set /etc/ssl here because some environments (e.g., YSS root filesystems) don't have # /usr/lib/ssl at all. "-DOPENSSLDIR=\\\"/etc/ssl\\\"", # This is basically a no-op, since we've disabled dynamic loading of engines. '-DENGINESDIR=\\"/usr/lib/engines-3.0\\"', # also basically a no-op "-DMODULESDIR=\\\"/dev/null\\\"", "-DL_ENDIAN", "-DOPENSSL_USE_NODELETE", ] + select({ "//configs:linux_aarch64": ["-mno-outline-atomics"], "//conditions:default": [], }) + select({ "//configs:windows_arm64": [ # Windows-specific flags can go here if needed ], "//configs:windows_x64": [ # Windows-specific flags can go here if needed ], "//conditions:default": [ # As described in https://github.com/openssl/openssl/issues/4575, OpenSSL doesn't mark its # assembly files as not requiring an executable stack. Pass --noexecstack to the assembler # to do this. "-Wa,--noexecstack", "-Wno-unused-command-line-argument", # If someone wants to link with -fPIC, the objects they're linking need to have been built with it. # Add this flag so that people can choose to link that way if they want to. "-fPIC", ], }) cc_binary( name = "openssl", srcs = ALL_OPENSSL_APP_SRCS + ALL_OPENSSL_APP_HDRS, copts = COMMON_OPENSSL_COPTS + select({ "//configs:darwin_arm64": _DARWIN_ARM64_OPENSSL_APP_DEFINES, "//configs:darwin_x86_64": _DARWIN_X86_64_OPENSSL_APP_DEFINES, "//configs:linux_aarch64": _LINUX_ARM64_OPENSSL_APP_DEFINES, "//configs:linux_x86_64": _LINUX_X86_64_OPENSSL_APP_DEFINES, "//configs:windows_arm64": _WINDOWS_ARM64_OPENSSL_APP_DEFINES, "//configs:windows_x64": _WINDOWS_X86_64_OPENSSL_APP_DEFINES, }) + select({ "//configs:windows_arm64": OPENSSL_APP_WINDOWS_COPTS, "//configs:windows_x64": OPENSSL_APP_WINDOWS_COPTS, "//conditions:default": OPENSSL_APP_NIX_COPTS, }), defines = COMMON_OPENSSL_DEFINES, includes = OPENSSL_APP_INCLUDES, linkopts = select({ "//configs:windows_arm64": OPENSSL_APP_WINDOWS_LINKOPTS, "//configs:windows_x64": OPENSSL_APP_WINDOWS_LINKOPTS, "//conditions:default": OPENSSL_APP_NIX_LINKOPTS, }), visibility = ["//visibility:public"], deps = [":ssl"], ) NIX_ARM64_PERLASM_TOOLS_AND_OUTS, NIX_ARM64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT = parse_perlasm_gen(_NIX_ARM64_PERLASM_GEN) NIX_X86_64_PERLASM_TOOLS_AND_OUTS, NIX_X86_64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT = parse_perlasm_gen(_NIX_X86_64_PERLASM_GEN) WINDOWS_ARM64_PERLASM_TOOLS_AND_OUTS, WINDOWS_ARM64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT = parse_perlasm_gen(_WINDOWS_ARM64_PERLASM_GEN) WINDOWS_X86_64_PERLASM_TOOLS_AND_OUTS, WINDOWS_X86_64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT = parse_perlasm_gen(_WINDOWS_X86_64_PERLASM_GEN) PERLASM_TOOLS = glob(["crypto/perlasm/*.pl"]) perl_genrule( name = "perlasm_genfiles", additional_srcs = PERLASM_TOOLS + ["crypto/ec/ecp_nistz256_table.c"], assembly_flavor = select({ "//configs:darwin_arm64": "ios64", "//configs:darwin_x86_64": "macosx", "//configs:linux_aarch64": "linux64", "//configs:linux_x86_64": "elf", "//configs:windows_arm64": "win64", "//configs:windows_x64": "masm", }), srcs_to_outs = select({ "//configs:darwin_arm64": NIX_ARM64_PERLASM_TOOLS_AND_OUTS, "//configs:darwin_x86_64": NIX_X86_64_PERLASM_TOOLS_AND_OUTS, "//configs:linux_aarch64": NIX_ARM64_PERLASM_TOOLS_AND_OUTS, "//configs:linux_x86_64": NIX_X86_64_PERLASM_TOOLS_AND_OUTS, "//configs:windows_arm64": WINDOWS_ARM64_PERLASM_TOOLS_AND_OUTS, "//configs:windows_x64": WINDOWS_X86_64_PERLASM_TOOLS_AND_OUTS, }), srcs_to_outs_dupes = select({ "//configs:darwin_arm64": NIX_ARM64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT, "//configs:darwin_x86_64": NIX_X86_64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT, "//configs:linux_aarch64": NIX_ARM64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT, "//configs:linux_x86_64": NIX_X86_64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT, "//configs:windows_arm64": WINDOWS_ARM64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT, "//configs:windows_x64": WINDOWS_X86_64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT, }), ) COMMON_LIBCRYPTO_HDRS = glob( include = [ "crypto/**/*.h", "crypto/*.h", "include/crypto/**/*.h", "include/internal/*.h", "include/openssl/*.h", "providers/**/*.h", "providers/*.inc", "providers/implementations/**/*.inc", ], exclude = _COMMON_GENERATED_FILES_COMBINED, ) # We miss some sources and headers when doing the normal extraction OTHER_LIBCRYPTO_WINDOWS_HDRS = [ "engines/e_capi_err.h", ] OTHER_LIBCRYPTO_WINDOWS_SRCS = [] ALL_LIBCRYPTO_HDRS = COMMON_LIBCRYPTO_HDRS + select({ "//configs:darwin_arm64": _DARWIN_ARM64_LIBCRYPTO_HDRS, "//configs:darwin_x86_64": _DARWIN_X86_64_LIBCRYPTO_HDRS, "//configs:linux_aarch64": _LINUX_ARM64_LIBCRYPTO_HDRS, "//configs:linux_x86_64": _LINUX_X86_64_LIBCRYPTO_HDRS, "//configs:windows_arm64": _WINDOWS_ARM64_LIBCRYPTO_HDRS + OTHER_LIBCRYPTO_WINDOWS_HDRS, "//configs:windows_x64": _WINDOWS_X86_64_LIBCRYPTO_HDRS + OTHER_LIBCRYPTO_WINDOWS_HDRS, }) ALL_LIBCRYPTO_SRCS = select({ "//configs:darwin_arm64": remove_dupes( _DARWIN_ARM64_LIBCRYPTO_SRCS, NIX_ARM64_PERLASM_TOOLS_AND_OUTS.values() + NIX_ARM64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT.values(), ), "//configs:darwin_x86_64": remove_dupes( _DARWIN_X86_64_LIBCRYPTO_SRCS, NIX_X86_64_PERLASM_TOOLS_AND_OUTS.values() + NIX_X86_64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT.values(), ), "//configs:linux_aarch64": remove_dupes( _LINUX_ARM64_LIBCRYPTO_SRCS, NIX_ARM64_PERLASM_TOOLS_AND_OUTS.values() + NIX_ARM64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT.values(), ), "//configs:linux_x86_64": remove_dupes( _LINUX_X86_64_LIBCRYPTO_SRCS, NIX_X86_64_PERLASM_TOOLS_AND_OUTS.values() + NIX_X86_64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT.values(), ), "//configs:windows_arm64": remove_dupes( _WINDOWS_ARM64_LIBCRYPTO_SRCS, WINDOWS_ARM64_PERLASM_TOOLS_AND_OUTS.values() + WINDOWS_ARM64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT.values(), ) + OTHER_LIBCRYPTO_WINDOWS_SRCS, "//configs:windows_x64": remove_dupes( _WINDOWS_X86_64_LIBCRYPTO_SRCS, WINDOWS_X86_64_PERLASM_TOOLS_AND_OUTS.values() + WINDOWS_X86_64_PERLASM_TOOLS_AND_OUTS_DUPES_DICT.values(), ) + OTHER_LIBCRYPTO_WINDOWS_SRCS, }) LIBCRYPTO_NIX_COPTS = [ ] LIBCRYPTO_WINDOWS_COPTS = [ ] LIBCRYPTO_INCLUDES = [ "providers/implementations/macs", "providers/implementations/include", "providers/common/include", "providers/fips/include", "crypto", ] # Windows needs some additional include directories. LIBCRYPTO_WINDOWS_INCLUDES = [ "ms", "engines", "crypto/bn", "crypto", ] cc_library( name = "crypto", # Some of the srcs are duplicated because we have to glob over the directories with missing files # as only some of them are picked up. srcs = ALL_LIBCRYPTO_SRCS + [":perlasm_genfiles"], hdrs = ALL_LIBCRYPTO_HDRS, # To make sure downstream targets add the right copts to be able to include the headers. copts = COMMON_OPENSSL_COPTS + select({ "//configs:darwin_arm64": _DARWIN_ARM64_OPENSSL_DEFINES, "//configs:darwin_x86_64": _DARWIN_X86_64_OPENSSL_DEFINES, "//configs:linux_aarch64": _LINUX_ARM64_OPENSSL_DEFINES, "//configs:linux_x86_64": _LINUX_X86_64_OPENSSL_DEFINES, "//configs:windows_arm64": _WINDOWS_ARM64_OPENSSL_DEFINES, "//configs:windows_x64": _WINDOWS_X86_64_OPENSSL_DEFINES, }) + select({ "//configs:darwin_arm64": _DARWIN_ARM64_LIBCRYPTO_DEFINES, "//configs:darwin_x86_64": _DARWIN_X86_64_LIBCRYPTO_DEFINES, "//configs:linux_aarch64": _LINUX_ARM64_LIBCRYPTO_DEFINES, "//configs:linux_x86_64": _LINUX_X86_64_LIBCRYPTO_DEFINES, "//configs:windows_arm64": _WINDOWS_ARM64_LIBCRYPTO_DEFINES, "//configs:windows_x64": _WINDOWS_X86_64_LIBCRYPTO_DEFINES, }) + select({ "//configs:windows_arm64": LIBCRYPTO_WINDOWS_COPTS, "//configs:windows_x64": LIBCRYPTO_WINDOWS_COPTS, "//conditions:default": LIBCRYPTO_NIX_COPTS, }), defines = COMMON_OPENSSL_DEFINES, includes = [ "include", ] + LIBCRYPTO_INCLUDES + select({ "//configs:windows_arm64": LIBCRYPTO_WINDOWS_INCLUDES, "//configs:windows_x64": LIBCRYPTO_WINDOWS_INCLUDES, "//conditions:default": [], }), linkopts = [ "-lc", "-pthread", ], textual_hdrs = CRYPTO_TEXTUAL_HDRS, visibility = ["//visibility:public"], ) COMMON_LIBSSL_HDRS = glob( include = ["ssl/**/*.h"], exclude = _COMMON_GENERATED_FILES_COMBINED, ) ALL_LIBSSL_HDRS = COMMON_LIBSSL_HDRS + select({ "//configs:darwin_arm64": _DARWIN_ARM64_LIBSSL_HDRS, "//configs:darwin_x86_64": _DARWIN_X86_64_LIBSSL_HDRS, "//configs:linux_aarch64": _LINUX_ARM64_LIBSSL_HDRS, "//configs:linux_x86_64": _LINUX_X86_64_LIBSSL_HDRS, "//configs:windows_arm64": _WINDOWS_ARM64_LIBSSL_HDRS, "//configs:windows_x64": _WINDOWS_X86_64_LIBSSL_HDRS, }) ALL_LIBSSL_SRCS = select({ "//configs:darwin_arm64": _DARWIN_ARM64_LIBSSL_SRCS, "//configs:darwin_x86_64": _DARWIN_X86_64_LIBSSL_SRCS, "//configs:linux_aarch64": _LINUX_ARM64_LIBSSL_SRCS, "//configs:linux_x86_64": _LINUX_X86_64_LIBSSL_SRCS, "//configs:windows_arm64": _WINDOWS_ARM64_LIBSSL_SRCS, "//configs:windows_x64": _WINDOWS_X86_64_LIBSSL_SRCS, }) cc_library( name = "ssl", srcs = ALL_LIBSSL_SRCS, hdrs = ALL_LIBSSL_HDRS, copts = COMMON_OPENSSL_COPTS + select({ "//configs:darwin_arm64": _DARWIN_ARM64_OPENSSL_DEFINES, "//configs:darwin_x86_64": _DARWIN_X86_64_OPENSSL_DEFINES, "//configs:linux_aarch64": _LINUX_ARM64_OPENSSL_DEFINES, "//configs:linux_x86_64": _LINUX_X86_64_OPENSSL_DEFINES, "//configs:windows_arm64": _WINDOWS_ARM64_OPENSSL_DEFINES, "//configs:windows_x64": _WINDOWS_X86_64_OPENSSL_DEFINES, }) + select({ "//configs:darwin_arm64": _DARWIN_ARM64_LIBSSL_DEFINES, "//configs:darwin_x86_64": _DARWIN_X86_64_LIBSSL_DEFINES, "//configs:linux_aarch64": _LINUX_ARM64_LIBSSL_DEFINES, "//configs:linux_x86_64": _LINUX_X86_64_LIBSSL_DEFINES, "//configs:windows_arm64": _WINDOWS_ARM64_LIBSSL_DEFINES, "//configs:windows_x64": _WINDOWS_X86_64_LIBSSL_DEFINES, }), defines = COMMON_OPENSSL_DEFINES, # To make sure downstream targets add the right copts to be able to include the headers. includes = ["include"], linkopts = ["-lc"], visibility = ["//visibility:public"], deps = [ ":crypto", ], ) # Keep this filegroup for gen_dir target filegroup( name = "generated-headers", srcs = select({ "//configs:darwin_arm64": depset([ f for f in _DARWIN_ARM64_LIBCRYPTO_HDRS + _DARWIN_ARM64_LIBSSL_HDRS + _DARWIN_ARM64_OPENSSL_APP_HDRS if f.startswith(":") ]).to_list(), "//configs:darwin_x86_64": depset([ f for f in _DARWIN_X86_64_LIBCRYPTO_HDRS + _DARWIN_X86_64_LIBSSL_HDRS + _DARWIN_X86_64_OPENSSL_APP_HDRS if f.startswith(":") ]).to_list(), "//configs:linux_aarch64": depset([ f for f in _LINUX_ARM64_LIBCRYPTO_HDRS + _LINUX_ARM64_LIBSSL_HDRS + _LINUX_ARM64_OPENSSL_APP_HDRS if f.startswith(":") ]).to_list(), "//configs:linux_x86_64": depset([ f for f in _LINUX_X86_64_LIBCRYPTO_HDRS + _LINUX_X86_64_LIBSSL_HDRS + _LINUX_X86_64_OPENSSL_APP_HDRS if f.startswith(":") ]).to_list(), "//configs:windows_arm64": depset([ f for f in _WINDOWS_ARM64_LIBCRYPTO_HDRS + _WINDOWS_ARM64_LIBSSL_HDRS + _WINDOWS_ARM64_OPENSSL_APP_HDRS if f.startswith(":") ]).to_list(), "//configs:windows_x64": depset([ f for f in _WINDOWS_X86_64_LIBCRYPTO_HDRS + _WINDOWS_X86_64_LIBSSL_HDRS + _WINDOWS_X86_64_OPENSSL_APP_HDRS if f.startswith(":") ]).to_list(), }), ) write_file( name = "unused", out = "unused.h", content = [], newline = "unix", target_compatible_with = ["@platforms//:incompatible"], ) [ copy_file( name = "copy_generated_{}".format(src), src = select({ "//configs:darwin_arm64": DARWIN_ARM64_COMMON_GENERATED_FILES.get(src, ":unused"), "//configs:darwin_x86_64": DARWIN_X86_64_COMMON_GENERATED_FILES.get(src, ":unused"), "//configs:linux_aarch64": LINUX_ARM64_COMMON_GENERATED_FILES.get(src, ":unused"), "//configs:linux_x86_64": LINUX_X86_64_COMMON_GENERATED_FILES.get(src, ":unused"), "//configs:windows_arm64": WINDOWS_ARM64_COMMON_GENERATED_FILES.get(src, ":unused"), "//configs:windows_x64": WINDOWS_X86_64_COMMON_GENERATED_FILES.get(src, ":unused"), }), out = src, ) for src in _COMMON_GENERATED_FILES_COMBINED ] _PLATFORM_FILES = { "//configs:darwin_arm64": _DARWIN_ARM64_GEN_FILES, "//configs:darwin_x86_64": _DARWIN_X86_64_GEN_FILES, "//configs:linux_aarch64": _LINUX_ARM64_GEN_FILES, "//configs:linux_x86_64": _LINUX_X86_64_GEN_FILES, "//configs:windows_arm64": _WINDOWS_ARM64_GEN_FILES, "//configs:windows_x64": _WINDOWS_X86_64_GEN_FILES, } # Flatten all filenames into a set by collecting them into a dict _PLATFORM_ALL_FILE_NAMES = { v: None for inner in _PLATFORM_FILES.values() for v in inner.keys() }.keys() [ write_file( name = "gen_{}".format( fname.replace("/", "_"), ), out = fname, content = select({ cfg: [mapping.get(fname, "")] for cfg, mapping in _PLATFORM_FILES.items() }), newline = "unix", ) for fname in _PLATFORM_ALL_FILE_NAMES ] filegroup( name = "generate-platform-specific-files", srcs = select({ cfg: [fname for fname in mapping.keys()] for cfg, mapping in _PLATFORM_FILES.items() }), ) collate_into_directory( name = "gen_dir", outs_prefix_map = { ":crypto": "lib/", ":openssl": "bin/", ":ssl": "lib/", }, srcs_prefix_map = { ":crypto": "external/{}".format(_REPO_NAME), ":generated-headers": "external/{}".format(_REPO_NAME), ":openssl": "external/{}".format(_REPO_NAME), ":ssl": "external/{}".format(_REPO_NAME), } | { k: "external/{}".format(_REPO_NAME) for k in glob( include = ["include/openssl/*.h"], exclude = _COMMON_GENERATED_FILES_COMBINED, ) }, visibility = ["//visibility:public"], )