blob: f743cf43f00aa4f6d91884d6a5deb54a97aca8d1 [file]
"""https://libgd.org/"""
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")
load("@bazel_skylib//rules:write_file.bzl", "write_file")
load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("@rules_cc_autoconf//autoconf:autoconf.bzl", "autoconf")
load("@rules_cc_autoconf//autoconf:autoconf_hdr.bzl", "autoconf_hdr")
load("@rules_cc_autoconf//autoconf:checks.bzl", "checks", "macros")
load("@rules_cc_autoconf//autoconf:package_info.bzl", "package_info")
# ===== Optional feature flags (mirrors configure.ac --with-* / --enable-*) ===
# Dependencies available in BCR
bool_flag(
name = "enable_zlib",
build_setting_default = False,
)
bool_flag(
name = "enable_png",
build_setting_default = False,
)
bool_flag(
name = "enable_jpeg",
build_setting_default = False,
)
bool_flag(
name = "enable_freetype",
build_setting_default = False,
)
bool_flag(
name = "enable_tiff",
build_setting_default = False,
)
bool_flag(
name = "enable_webp",
build_setting_default = False,
)
bool_flag(
name = "enable_heif",
build_setting_default = False,
)
bool_flag(
name = "enable_avif",
build_setting_default = False,
)
# Dependencies NOT available in BCR (stubs will error if enabled)
bool_flag(
name = "enable_fontconfig",
build_setting_default = False,
)
bool_flag(
name = "enable_xpm",
build_setting_default = False,
)
bool_flag(
name = "enable_raqm",
build_setting_default = False,
)
bool_flag(
name = "enable_liq",
build_setting_default = False,
)
# Non-library feature flag
bool_flag(
name = "enable_gd_formats",
build_setting_default = False,
)
config_setting(
name = "enable_zlib_on",
flag_values = {":enable_zlib": "True"},
)
config_setting(
name = "enable_png_on",
flag_values = {":enable_png": "True"},
)
config_setting(
name = "enable_jpeg_on",
flag_values = {":enable_jpeg": "True"},
)
config_setting(
name = "enable_freetype_on",
flag_values = {":enable_freetype": "True"},
)
config_setting(
name = "enable_tiff_on",
flag_values = {":enable_tiff": "True"},
)
config_setting(
name = "enable_webp_on",
flag_values = {":enable_webp": "True"},
)
config_setting(
name = "enable_fontconfig_on",
flag_values = {":enable_fontconfig": "True"},
)
config_setting(
name = "enable_heif_on",
flag_values = {":enable_heif": "True"},
)
config_setting(
name = "enable_avif_on",
flag_values = {":enable_avif": "True"},
)
config_setting(
name = "enable_xpm_on",
flag_values = {":enable_xpm": "True"},
)
config_setting(
name = "enable_raqm_on",
flag_values = {":enable_raqm": "True"},
)
config_setting(
name = "enable_liq_on",
flag_values = {":enable_liq": "True"},
)
config_setting(
name = "enable_gd_formats_on",
flag_values = {":enable_gd_formats": "True"},
)
# ===== Stubs for dependencies not available in BCR ===========================
_NOT_AVAILABLE_DEPS = {
"fontconfig": "fontconfig",
"liq": "libimagequant",
"raqm": "raqm",
"xpm": "libxpm",
}
[
write_file(
name = "_" + name + "_stub_src",
out = "_" + name + "_stub.c",
content = [
'#error "' + pkg + " is not available in the Bazel Central Registry. " +
"Please contribute a " + pkg + ' module to enable this feature."',
],
)
for name, pkg in _NOT_AVAILABLE_DEPS.items()
]
[
cc_library(
name = "_" + name + "_stub",
srcs = [":_" + name + "_stub_src"],
tags = ["manual"],
)
for name in _NOT_AVAILABLE_DEPS
]
# ===== Autoconf configuration ================================================
# AC_INIT([GD], [2.3.3], [https://github.com/libgd/libgd/issues], [libgd], [https://lib.gd])
package_info(
name = "package",
package_name = "GD",
aliases = {
"PACKAGE": "PACKAGE_TARNAME",
"VERSION": "PACKAGE_VERSION",
},
module_bazel = "MODULE.bazel",
package_bugreport = "https://github.com/libgd/libgd/issues",
package_tarname = "libgd",
package_url = "https://lib.gd",
strip_bcr_version = True,
)
autoconf(
name = "autoconf",
checks =
# AC_CHECK_HEADERS_ONCE (configure.ac:64-72)
macros.AC_CHECK_HEADERS([
"dirent.h",
"dlfcn.h",
"inttypes.h",
"memory.h",
"stdint.h",
"stdlib.h",
"string.h",
"strings.h",
"sys/stat.h",
"sys/types.h",
"unistd.h",
]) + [
# AC_HEADER_STDC
checks.AC_DEFINE("STDC_HEADERS", 1),
# AC_CHECK_HEADERS(iconv.h) (configure.ac:81)
checks.AC_CHECK_HEADER(
"iconv.h",
define = "HAVE_ICONV_H",
),
# AM_ICONV: check for iconv availability (configure.ac:76)
checks.AC_TRY_LINK(
code = """\
#include <iconv.h>
int main(void) {
iconv_t cd = iconv_open("UTF-8", "ASCII");
iconv_close(cd);
return 0;
}
""",
define = "HAVE_ICONV",
),
# Check for iconv_t in iconv.h (configure.ac:82-87)
checks.AC_TRY_COMPILE(
code = """\
#include <iconv.h>
int main(void) {
iconv_t x;
(void)x;
return 0;
}
""",
define = "HAVE_ICONV_T_DEF",
),
# ICONV_CONST: modern systems use non-const (configure.ac:76)
checks.AC_DEFINE("ICONV_CONST", ""),
# AC_CHECK_FUNC(sin) / AC_CHECK_LIB(m, sin) (configure.ac:99)
checks.AC_CHECK_LIB(
"m",
"sin",
define = "HAVE_LIBM",
),
# AX_PTHREAD() (configure.ac:101)
checks.AC_CHECK_LIB(
"pthread",
"pthread_create",
define = "HAVE_PTHREAD",
),
# gl_VISIBILITY() (configure.ac:304)
checks.AC_TRY_COMPILE(
code = """\
extern __attribute__((__visibility__("hidden"))) int hiddenvar;
extern __attribute__((__visibility__("default"))) int exportedvar;
int main(void) { return 0; }
""",
define = "HAVE_VISIBILITY",
),
] +
# ENABLE_GD_FORMATS (configure.ac:109)
select({
":enable_gd_formats_on": [checks.AC_DEFINE("ENABLE_GD_FORMATS", 1)],
"//conditions:default": [checks.AC_DEFINE("ENABLE_GD_FORMATS", 0)],
}) +
# Optional library defines (configure.ac:197-302)
select({
":enable_zlib_on": [checks.AC_DEFINE("HAVE_LIBZ", 1)],
"//conditions:default": [],
}) +
select({
":enable_png_on": [checks.AC_DEFINE("HAVE_LIBPNG", 1)],
"//conditions:default": [],
}) +
select({
":enable_jpeg_on": [checks.AC_DEFINE("HAVE_LIBJPEG", 1)],
"//conditions:default": [],
}) +
select({
":enable_freetype_on": [
checks.AC_DEFINE("HAVE_LIBFREETYPE", 1),
checks.AC_DEFINE("HAVE_FT2BUILD_H", 1),
],
"//conditions:default": [],
}) +
select({
":enable_fontconfig_on": [checks.AC_DEFINE("HAVE_LIBFONTCONFIG", 1)],
"//conditions:default": [],
}) +
select({
":enable_tiff_on": [checks.AC_DEFINE("HAVE_LIBTIFF", 1)],
"//conditions:default": [],
}) +
select({
":enable_webp_on": [checks.AC_DEFINE("HAVE_LIBWEBP", 1)],
"//conditions:default": [],
}) +
select({
":enable_heif_on": [checks.AC_DEFINE("HAVE_LIBHEIF", 1)],
"//conditions:default": [],
}) +
select({
":enable_avif_on": [checks.AC_DEFINE("HAVE_LIBAVIF", 1)],
"//conditions:default": [],
}) +
select({
":enable_xpm_on": [checks.AC_DEFINE("HAVE_LIBXPM", 1)],
"//conditions:default": [],
}) +
select({
":enable_raqm_on": [checks.AC_DEFINE("HAVE_LIBRAQM", 1)],
"//conditions:default": [],
}) +
select({
":enable_liq_on": [checks.AC_DEFINE("HAVE_LIBIMAGEQUANT", 1)],
"//conditions:default": [],
}),
deps = [":package"],
)
# AC_CONFIG_HEADERS([src/config.h:src/config.hin])
autoconf_hdr(
name = "config_h",
out = "src/config.h",
template = "src/config.hin",
deps = [":autoconf"],
)
# ===== Library ===============================================================
alias(
name = "libgd",
actual = ":gd",
visibility = ["//visibility:public"],
)
cc_library(
name = "gd",
srcs = [
# Source files (Makefile.am:libgd_la_SOURCES)
"src/gd.c",
"src/gd_avif.c",
"src/gd_bmp.c",
"src/gd_color.c",
"src/gd_color_map.c",
"src/gd_color_match.c",
"src/gd_crop.c",
"src/gd_filename.c",
"src/gd_filter.c",
"src/gd_gd.c",
"src/gd_gd2.c",
"src/gd_gif_in.c",
"src/gd_gif_out.c",
"src/gd_heif.c",
"src/gd_interpolation.c",
"src/gd_io.c",
"src/gd_io_dp.c",
"src/gd_io_file.c",
"src/gd_io_ss.c",
"src/gd_jpeg.c",
"src/gd_matrix.c",
"src/gd_nnquant.c",
"src/gd_png.c",
"src/gd_rotate.c",
"src/gd_security.c",
"src/gd_ss.c",
"src/gd_tga.c",
"src/gd_tiff.c",
"src/gd_topal.c",
"src/gd_transform.c",
"src/gd_version.c",
"src/gd_wbmp.c",
"src/gd_webp.c",
"src/gd_xbm.c",
"src/gdcache.c",
"src/gdfontg.c",
"src/gdfontl.c",
"src/gdfontmb.c",
"src/gdfonts.c",
"src/gdfontt.c",
"src/gdft.c",
"src/gdfx.c",
"src/gdhelpers.c",
"src/gdkanji.c",
"src/gdtables.c",
"src/gdxpm.c",
"src/wbmp.c",
# Private headers
"src/bmp.h",
"src/entities.h",
"src/gd_color.h",
"src/gd_intern.h",
"src/gd_io_stream.h",
"src/gd_nnquant.h",
"src/gd_tga.h",
"src/gdhelpers.h",
"src/jisx0208.h",
"src/wbmp.h",
# Generated config header
":config_h",
] + select({
"@platforms//os:windows": [
"src/msinttypes/inttypes.h",
"src/msinttypes/stdint.h",
],
"//conditions:default": [],
}),
hdrs = [
# Public headers (Makefile.am:include_HEADERS)
"src/gd.h",
"src/gd_color_map.h",
"src/gd_errors.h",
"src/gd_io.h",
"src/gdcache.h",
"src/gdfontg.h",
"src/gdfontl.h",
"src/gdfontmb.h",
"src/gdfonts.h",
"src/gdfontt.h",
"src/gdfx.h",
"src/gdpp.h",
],
copts = select({
"@rules_cc//cc/compiler:msvc-cl": ["/W0"],
"//conditions:default": ["-w"],
}),
includes = ["src"],
linkopts = select({
"@platforms//os:linux": [
"-lm",
"-lpthread",
],
"//conditions:default": ["-lm"],
}),
defines = select({
"@platforms//os:windows": [
"BGDWIN32",
"NONDLL",
],
"//conditions:default": [],
}),
local_defines = ["HAVE_CONFIG_H"] + select({
"@platforms//os:windows": [],
"//conditions:default": ["HAVE_STDINT_H"],
}),
visibility = ["//visibility:public"],
deps =
# BCR dependencies (conditional)
select({
":enable_zlib_on": ["@zlib"],
"//conditions:default": [],
}) +
select({
":enable_png_on": ["@libpng"],
"//conditions:default": [],
}) +
select({
":enable_jpeg_on": ["@libjpeg_turbo"],
"//conditions:default": [],
}) +
select({
":enable_freetype_on": ["@freetype"],
"//conditions:default": [],
}) +
select({
":enable_tiff_on": ["@libtiff//:tiff"],
"//conditions:default": [],
}) +
select({
":enable_webp_on": ["@libwebp"],
"//conditions:default": [],
}) +
select({
":enable_heif_on": ["@libheif"],
"//conditions:default": [],
}) +
select({
":enable_avif_on": ["@libavif"],
"//conditions:default": [],
}) +
# Stub dependencies (will error at compile time if enabled)
select({
":enable_fontconfig_on": [":_fontconfig_stub"],
"//conditions:default": [],
}) +
select({
":enable_xpm_on": [":_xpm_stub"],
"//conditions:default": [],
}) +
select({
":enable_raqm_on": [":_raqm_stub"],
"//conditions:default": [],
}) +
select({
":enable_liq_on": [":_liq_stub"],
"//conditions:default": [],
}),
)
cc_library(
name = "gd_internal",
testonly = True,
hdrs = ["src/gd_intern.h"],
includes = ["src"],
visibility = ["//:__subpackages__"],
deps = [":gd"],
)