blob: ca4b554fccc8881306a03bc9517958a2873d090c [file] [log] [blame]
# This BUILD file was written based off of the `build.rs` script for the Rust
# crate `libgit2-sys`. For more details, see the crate's source:
# https://github.com/rust-lang/git2-rs/tree/libgit2-sys-0.13.0/libgit2-sys
load("@bazel_skylib//lib:selects.bzl", "selects")
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")
load("@bazel_skylib//rules:write_file.bzl", "write_file")
load("@rules_cc//cc:defs.bzl", "cc_library")
[
config_setting(
name = plat,
constraint_values = ["@platforms//os:{}".format(plat)],
)
for plat in [
"macos",
"ios",
"tvos",
"windows",
]
]
# env::var("CARGO_FEATURE_SSH").is_ok()
bool_flag(
name = "ssh",
build_setting_default = False,
)
config_setting(
name = "ssh_setting",
flag_values = {":ssh": "True"},
)
# target.contains("apple")
selects.config_setting_group(
name = "apple",
match_any = [
":macos",
":ios",
":tvos",
],
)
[
config_setting(
name = "cpu_" + cpu,
constraint_values = ["@platforms//cpu:{}".format(cpu)],
)
for cpu in [
"i386",
"x86_32",
]
]
# env::var("CARGO_CFG_TARGET_POINTER_WIDTH").unwrap() == "32"
selects.config_setting_group(
name = "pointer_width_32",
match_any = [
"cpu_i386",
"cpu_x86_32",
],
)
# env::var("CARGO_FEATURE_HTTPS").is_ok()
bool_flag(
name = "https",
build_setting_default = False,
)
config_setting(
name = "https_setting",
flag_values = {":https": "True"},
)
# if https && target.contains("windows")
selects.config_setting_group(
name = "https_windows",
match_all = [
":https_setting",
":windows",
],
)
# if https && target.contains("apple")
selects.config_setting_group(
name = "https_apple",
match_all = [
":https_setting",
":apple",
],
)
cc_library(
name = "http-parser",
srcs = glob(["deps/http-parser/*.c"]),
hdrs = glob(["deps/http-parser/*.h"]),
copts = select({
# Required in `opt` builds to solve the following error
# libpcre.a(pcre_compile.o): requires unsupported dynamic reloc 11; recompile with -fPIC
"@platforms//os:linux": ["-fPIC"],
"//conditions:default": [],
}),
includes = ["deps/http-parser"],
linkstatic = True,
)
cc_library(
name = "pcre",
srcs = glob(["deps/pcre/**/*.c"]),
hdrs = glob(["deps/pcre/**/*.h"]),
copts = select({
# Required in `opt` builds to solve the following error
# libhttp-parser.a(http_parser.o): requires unsupported dynamic reloc 11; recompile with -fPIC
"@platforms//os:linux": ["-fPIC"],
"//conditions:default": [],
}),
defines = [
"HAVE_STDINT_H=1",
"HAVE_MEMMOVE=1",
"NO_RECURSE=1",
"NEWLINE=10",
"POSIX_MALLOC_THRESHOLD=10",
"LINK_SIZE=2",
"PARENS_NEST_LIMIT=250",
"MATCH_LIMIT=10000000",
"MATCH_LIMIT_RECURSION=MATCH_LIMIT",
"MAX_NAME_SIZE=32",
"MAX_NAME_COUNT=10000",
],
includes = ["deps/pcre"],
linkstatic = True,
)
write_file(
name = "configure_features",
out = "include/git2/sys/features.h",
content = [
"#ifndef INCLUDE_features_h",
"#define INCLUDE_features_h",
"#define GIT_THREADS 1",
"#define GIT_TRACE 1",
] +
# !target.contains("android")
select({
"@platforms//os:android": [],
"//conditions:default": ["#define GIT_USE_NSEC 1"],
}) + select({
":apple": ["#define GIT_USE_STAT_MTIMESPEC 1"],
"//conditions:default": ["#define GIT_USE_STAT_MTIM 1"],
}) + select({
":pointer_width_32": ["#define GIT_ARCH_32 1"],
"//conditions:default": ["#define GIT_ARCH_64 1"],
}) + [
"#define GIT_SHA1_COLLISIONDETECT 1",
] + select({
":ssh_setting": ["#define GIT_SSH 1"],
"//conditions:default": [],
}) + select({
":https_apple": [
"#define GIT_SHA256_COMMON_CRYPTO 1",
"#define GIT_HTTPS 1",
"#define GIT_SECURE_TRANSPORT 1",
],
":https_setting": [
"#define GIT_SHA256_OPENSSL 1",
"#define GIT_HTTPS 1",
"#define GIT_OPENSSL 1",
],
# target.contains("windows")
":https_windows": [
"#define GIT_SHA256_WIN32 1",
"#define GIT_HTTPS 1",
"#define GIT_WINHTTP 1",
],
"//conditions:default": [
"#define GIT_SHA256_BUILTIN 1",
],
}) + select({
":apple": ["#define GIT_USE_ICONV 1"],
"//conditions:default": [],
}) + [
"#endif",
],
)
cc_library(
name = "include",
hdrs = [":configure_features"] + glob(["include/**/*.h"]),
strip_include_prefix = "include",
)
cc_library(
name = "git2",
srcs = [
"src/util/allocators/failalloc.c",
"src/util/allocators/stdalloc.c",
"src/util/allocators/win32_leakcheck.c",
# Use the CollisionDetection SHA1 implementation.
"src/util/hash/collisiondetect.c",
"src/util/hash/sha1dc/sha1.c",
"src/util/hash/sha1dc/ubc_check.c",
] + glob(
include = [
"src/libgit2/*.c",
"src/util/*.c",
"src/libgit2/xdiff/*.c",
"src/libgit2/transports/*.c",
"src/libgit2/streams/*.c",
],
exclude = [
"src/util/win32/**",
"src/util/unix/**",
],
) + select({
"@platforms//os:windows": glob(["src/util/win32/**/*.c"]),
"//conditions:default": glob(["src/util/unix/**/*.c"]),
}) + select({
":https_setting": [],
"//conditions:default": [
"src/util/hash/builtin.c",
"src/util/hash/rfc6234/sha224-256.c",
],
}),
hdrs = [
"src/util/allocators/failalloc.h",
"src/util/allocators/stdalloc.h",
"src/util/allocators/win32_leakcheck.h",
# Use the CollisionDetection SHA1 implementation.
"src/util/hash/sha1dc/sha1.h",
"src/util/hash/sha1dc/ubc_check.h",
] + glob(
include = [
"src/libgit2/*.h",
"src/libgit2/streams/*.h",
"src/libgit2/transports/*.h",
"src/libgit2/xdiff/*.h",
"src/util/*.h",
"src/util/hash/*.h",
"src/util/hash/rfc6234/*.h",
],
exclude = [
"src/util/win32/**",
"src/util/unix/**",
],
) + select({
"@platforms//os:windows": glob(["src/util/win32/**/*.h"]),
"//conditions:default": glob(["src/util/unix/**/*.h"]),
}),
copts = select({
"@platforms//os:linux": [
"-fvisibility=hidden",
"-fPIC",
"-Wall",
"-std=gnu90",
# On linux, optimization is required to avoid issues with missing (and unused) symbols:
# `liblibgit2.a(pack.pic.o):pack.c:function packfile_open_locked: error: undefined reference to 'fstat'`
#
# Always enabling optimization helps us avoid this though, it does seem unnecessary and this should
# probably be fixed.
"-O3",
],
"@platforms//os:windows": [],
"//conditions:default": [
"-fvisibility=hidden",
"-fPIC",
"-Wall",
"-std=gnu90",
],
}),
defines = [
# Use the CollisionDetection SHA1 implementation.
"SHA1DC_NO_STANDARD_INCLUDES=1",
"SHA1DC_CUSTOM_INCLUDE_SHA1_C=\\\"common.h\\\"",
"SHA1DC_CUSTOM_INCLUDE_UBC_CHECK_C=\\\"common.h\\\"",
# Use the included PCRE regex backend.
"GIT_REGEX_BUILTIN=1",
] + select({
":windows": ["STRSAFE_NO_DEPRECATE"],
"//conditions:default": [],
}),
includes = [
"src/libgit2",
"src/util",
],
linkstatic = True,
strip_include_prefix = "src",
visibility = ["//visibility:public"],
deps = [
":http-parser",
":include",
":pcre",
"@zlib",
],
)
alias(
name = "libgit2",
actual = ":git2",
visibility = ["//visibility:public"],
)