blob: 2cc0e1f6a3b16915563d0cbd0796933b45b32301 [file] [log] [blame]
load("@bazel_skylib//lib:selects.bzl", "selects")
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag", "string_flag")
load("@bazel_skylib//rules:expand_template.bzl", "expand_template")
package(features = ["no_copts_tokenization"])
string_flag(
name = "ssl_lib",
build_setting_default = "boringssl",
visibility = ["//visibility:public"],
)
config_setting(
name = "use_boringssl",
flag_values = {":ssl_lib": "boringssl"},
)
config_setting(
name = "use_mbedtls",
flag_values = {":ssl_lib": "mbedtls"},
)
selects.config_setting_group(
name = "not_use_mbedtls",
match_any = [
"use_boringssl",
"use_openssl",
],
)
config_setting(
name = "use_openssl",
flag_values = {":ssl_lib": "openssl"},
)
selects.config_setting_group(
name = "use_sectransport",
match_all = [
":not_use_mbedtls",
"@platforms//os:macos",
],
)
bool_flag(
name = "http_only",
build_setting_default = True,
)
config_setting(
name = "http_only_setting",
flag_values = {":http_only": "true"},
)
# Curl's default CA path depends on the OS. If CURL_CA_BUNDLE/CURL_CA_PATH are not set,
# (and you don't `curl_easy_setopt(curl_, CURLOPT_CAPATH, "/etc/ssl/certs");`), curl
# will fail to verify server certificates.
# The string_flag below allows the user to specify their (OS-specific) default CA path
# like `--@curl//:ca_bundle=/etc/ssl/certs/ca-certificates.crt` on the command line or
# in .bazelrc. See also https://github.com/curl/curl/blob/curl-8_8_0/acinclude.m4#L1202
string_flag(
name = "ca_bundle",
build_setting_default = "",
make_variable = "CURL_CA_BUNDLE",
)
config_setting(
name = "ca_bundle_is_unset",
flag_values = {":ca_bundle": ""},
)
string_flag(
name = "ca_path",
build_setting_default = "",
make_variable = "CURL_CA_PATH",
)
config_setting(
name = "ca_path_is_unset",
flag_values = {":ca_path": ""},
)
_BASE_CURL_COPTS = [
"-DCURL_DISABLE_LDAP=1",
"-DENABLE_IPV6=1",
"-DGETHOSTNAME_TYPE_ARG2=size_t",
"-DGETSERVBYPORT_R_ARGS=6",
"-DGETSERVBYPORT_R_BUFSIZE=4096",
"-DHAVE_ALARM=1",
"-DHAVE_ALLOCA_H=1",
"-DHAVE_ARPA_INET_H=1",
"-DHAVE_ARPA_TFTP_H=1",
"-DHAVE_ASSERT_H=1",
"-DHAVE_BASENAME=1",
"-DHAVE_BOOL_T=1",
"-DHAVE_CLOCK_GETTIME_MONOTONIC=1",
"-DHAVE_CONNECT=1",
"-DHAVE_DIRENT_H=1",
"-DHAVE_DLFCN_H=1",
"-DHAVE_ENGINE_LOAD_BUILTIN_ENGINES=1",
"-DHAVE_ERRNO_H=1",
"-DHAVE_FCNTL=1",
"-DHAVE_FCNTL_H=1",
"-DHAVE_FCNTL_O_NONBLOCK=1",
"-DHAVE_FDOPEN=1",
"-DHAVE_FREEADDRINFO=1",
"-DHAVE_FREEIFADDRS=1",
"-DHAVE_FSETXATTR=1",
"-DHAVE_FSETXATTR_5=1",
"-DHAVE_FTRUNCATE=1",
"-DHAVE_GAI_STRERROR=1",
"-DHAVE_GETADDRINFO=1",
"-DHAVE_GETADDRINFO_THREADSAFE=1",
"-DHAVE_GETEUID=1",
"-DHAVE_GETHOSTBYADDR=1",
"-DHAVE_GETHOSTBYADDR_R=1",
"-DHAVE_GETHOSTBYADDR_R_8=1",
"-DHAVE_GETHOSTBYNAME=1",
"-DHAVE_GETHOSTBYNAME_R=1",
"-DHAVE_GETHOSTBYNAME_R_6=1",
"-DHAVE_GETHOSTNAME=1",
"-DHAVE_GETIFADDRS=1",
"-DHAVE_GETNAMEINFO=1",
"-DHAVE_GETPPID=1",
"-DHAVE_GETPWUID=1",
"-DHAVE_GETPWUID_R=1",
"-DHAVE_GETRLIMIT=1",
"-DHAVE_GETSERVBYPORT_R=1",
"-DHAVE_GETSOCKNAME=1",
"-DHAVE_GETTIMEOFDAY=1",
"-DHAVE_GMTIME_R=1",
"-DHAVE_IFADDRS_H=1",
"-DHAVE_IF_NAMETOINDEX=1",
"-DHAVE_INET_NTOP=1",
"-DHAVE_INET_PTON=1",
"-DHAVE_INTTYPES_H=1",
"-DHAVE_IOCTL=1",
"-DHAVE_IOCTL_FIONBIO=1",
"-DHAVE_IOCTL_SIOCGIFADDR=1",
"-DHAVE_LIBGEN_H=1",
"-DHAVE_LL=1",
"-DHAVE_LOCALE_H=1",
"-DHAVE_LOCALTIME_R=1",
"-DHAVE_LONGLONG=1",
"-DHAVE_MALLOC_H=1",
"-DHAVE_MEMORY_H=1",
"-DHAVE_NETDB_H=1",
"-DHAVE_NETINET_IN_H=1",
"-DHAVE_NETINET_TCP_H=1",
"-DHAVE_NET_IF_H=1",
"-DHAVE_OPENDIR=1",
"-DHAVE_PIPE=1",
"-DHAVE_POLL=1",
"-DHAVE_POLL_FINE=1",
"-DHAVE_POLL_H=1",
"-DHAVE_POSIX_STRERROR_R=1",
"-DHAVE_PTHREAD_H=1",
"-DHAVE_PWD_H=1",
"-DHAVE_RECV=1",
"-DHAVE_SELECT=1",
"-DHAVE_SEND=1",
"-DHAVE_SETJMP_H=1",
"-DHAVE_SETLOCALE=1",
"-DHAVE_SETRLIMIT=1",
"-DHAVE_SETSOCKOPT=1",
"-DHAVE_SGTTY_H=1",
"-DHAVE_SIGACTION=1",
"-DHAVE_SIGINTERRUPT=1",
"-DHAVE_SIGNAL=1",
"-DHAVE_SIGNAL_H=1",
"-DHAVE_SIGSETJMP=1",
"-DHAVE_SIG_ATOMIC_T=1",
"-DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID=1",
"-DHAVE_SOCKET=1",
"-DHAVE_SOCKETPAIR=1",
"-DHAVE_STDBOOL_H=1",
"-DHAVE_STDINT_H=1",
"-DHAVE_STDIO_H=1",
"-DHAVE_STDLIB_H=1",
"-DHAVE_STRCASECMP=1",
"-DHAVE_STRDUP=1",
"-DHAVE_STRERROR_R=1",
"-DHAVE_STRINGS_H=1",
"-DHAVE_STRING_H=1",
"-DHAVE_STRNCASECMP=1",
"-DHAVE_STRSTR=1",
"-DHAVE_STRTOK_R=1",
"-DHAVE_STRTOLL=1",
"-DHAVE_STRUCT_SOCKADDR_STORAGE=1",
"-DHAVE_STRUCT_TIMEVAL=1",
"-DHAVE_SYS_IOCTL_H=1",
"-DHAVE_SYS_PARAM_H=1",
"-DHAVE_SYS_POLL_H=1",
"-DHAVE_SYS_RESOURCE_H=1",
"-DHAVE_SYS_SELECT_H=1",
"-DHAVE_SYS_SOCKET_H=1",
"-DHAVE_SYS_STAT_H=1",
"-DHAVE_SYS_TIME_H=1",
"-DHAVE_SYS_TYPES_H=1",
"-DHAVE_SYS_UIO_H=1",
"-DHAVE_SYS_UN_H=1",
"-DHAVE_SYS_WAIT_H=1",
"-DHAVE_SYS_XATTR_H=1",
"-DHAVE_TERMIOS_H=1",
"-DHAVE_TERMIO_H=1",
"-DHAVE_TIME_H=1",
"-DHAVE_UNISTD_H=1",
"-DHAVE_UTIME=1",
"-DHAVE_UTIMES=1",
"-DHAVE_UTIME_H=1",
"-DHAVE_VARIADIC_MACROS_C99=1",
"-DHAVE_VARIADIC_MACROS_GCC=1",
"-DHAVE_WRITABLE_ARGV=1",
"-DHAVE_WRITEV=1",
"-DRECV_TYPE_ARG1=int",
"-DRECV_TYPE_ARG2=void*",
"-DRECV_TYPE_ARG3=size_t",
"-DRECV_TYPE_ARG4=int",
"-DRECV_TYPE_RETV=ssize_t",
"-DRETSIGTYPE=void",
"-DSELECT_QUAL_ARG5=",
"-DSELECT_TYPE_ARG1=int",
"-DSELECT_TYPE_ARG234=fd_set*",
"-DSELECT_TYPE_RETV=int",
"-DSEND_QUAL_ARG2=const",
"-DSEND_TYPE_ARG1=int",
"-DSEND_TYPE_ARG2=void*",
"-DSEND_TYPE_ARG3=size_t",
"-DSEND_TYPE_ARG4=int",
"-DSEND_TYPE_RETV=ssize_t",
"-DSIZEOF_CURL_OFF_T=8",
"-DSIZEOF_INT=4",
"-DSIZEOF_LONG=8",
"-DSIZEOF_OFF_T=8",
"-DSIZEOF_SHORT=2",
"-DSIZEOF_SIZE_T=8",
"-DSIZEOF_TIME_T=8",
"-DSTDC_HEADERS=1",
"-DSTRERROR_R_TYPE_ARG3=size_t",
"-DTIME_WITH_SYS_TIME=1",
"-DUSE_THREADS_POSIX=1",
"-DUSE_UNIX_SOCKETS=1",
# Extra defines needed by curl
"-DBUILDING_LIBCURL",
"-DCURL_HIDDEN_SYMBOLS",
]
expand_template(
name = "symbol_versioning_map",
out = "lib/libcurl.vers",
substitutions = select({
":use_boringssl": {
"@CURL_LT_SHLIB_VERSIONED_FLAVOUR@": "OPENSSL_",
},
":use_openssl": {
"@CURL_LT_SHLIB_VERSIONED_FLAVOUR@": "OPENSSL_",
},
"//conditions:default": {
"@CURL_LT_SHLIB_VERSIONED_FLAVOUR@": "",
},
}),
template = "lib/libcurl.vers.in",
)
cc_library(
name = "curl",
srcs = glob([
"lib/**/*.c",
"lib/**/*.h",
]),
hdrs = glob(["include/curl/*.h"]),
additional_linker_inputs = [
":symbol_versioning_map",
],
copts = select({
"@platforms//os:windows": [
"/DWIN32",
"/DBUILDING_LIBCURL",
"/DUSE_WIN32_IDN",
"/DWANT_IDN_PROTOTYPES",
"/DUSE_IPV6",
"/DUSE_WINDOWS_SSPI",
"/DUSE_SCHANNEL",
],
"@platforms//os:macos": _BASE_CURL_COPTS,
"//conditions:default": _BASE_CURL_COPTS + [
"-DHAVE_LINUX_TCP_H=1",
"-DHAVE_MSG_NOSIGNAL=1",
],
}) + [
"-DOS=\"os\"",
],
defines = ["CURL_STATICLIB"],
includes = [
"include/",
"lib/",
],
linkopts = ["-Wl,--version-script=$(location :symbol_versioning_map)"] +
select({
":use_sectransport": [
"-Wl,-framework,CoreFoundation",
"-Wl,-framework,Security",
],
"//conditions:default": [],
}) + select({
"@platforms//os:windows": [
"-DEFAULTLIB:ws2_32.lib",
"-DEFAULTLIB:advapi32.lib",
"-DEFAULTLIB:crypt32.lib",
"-DEFAULTLIB:Normaliz.lib",
],
"@platforms//os:macos": [
"-Wl,-framework,SystemConfiguration",
],
"//conditions:default": [
"-lpthread",
],
}),
local_defines = select({
"@platforms//os:macos": [
'CURL_CA_BUNDLE=\\"/etc/ssl/cert.pem\\"',
'CURL_CA_PATH=\\"/etc/ssl/certs\\"',
],
"@platforms//os:linux": [
'CURL_CA_BUNDLE=\\"/etc/ssl/certs/ca-certificates.crt\\"',
'CURL_CA_PATH=\\"/etc/ssl/certs\\"',
],
"//conditions:default": [],
}) + select({
":use_boringssl": [
"USE_OPENSSL",
"HAVE_BORING_SSL=1",
],
":use_mbedtls": ["USE_MBEDTLS"],
":use_openssl": ["USE_OPENSSL"],
"//conditions:default": [],
}) + select({
":use_sectransport": ["USE_SECTRANSP"],
"//conditions:default": [],
}) + select({
":http_only_setting": ["HTTP_ONLY"],
"//conditions:default": [],
}) + select({
":ca_bundle_is_unset": [],
"//conditions:default": ['CURL_CA_BUNDLE=\\"$(CURL_CA_BUNDLE)\\"'],
}) + select({
":ca_path_is_unset": [],
"//conditions:default": ['CURL_CA_PATH=\\"$(CURL_CA_PATH)\\"'],
}),
toolchains = [
":ca_bundle",
":ca_path",
],
visibility = ["//visibility:public"],
deps = select({
":use_boringssl": [
"@boringssl//:crypto",
"@boringssl//:ssl",
],
":use_mbedtls": ["@mbedtls"],
":use_openssl": [
"@openssl//:crypto",
"@openssl//:ssl",
],
"//conditions:default": [],
}),
)
cc_binary(
name = "linktest",
linkopts = select({
"@platforms//os:macos": ["-all_load"],
"//conditions:default": [],
}),
linkshared = True,
visibility = ["//visibility:private"],
deps = [":curl"],
)