#  Copyright 2020 The Monogon Project Authors.
#
#  SPDX-License-Identifier: Apache-2.0
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

load("@rules_cc//cc:defs.bzl", "cc_library")
load("@dev_source_monogon//build/utils:template_file.bzl", "template_file")

# These are only for the headers of libcommon, which is a private dependency of libblkid and
# libuuid. Bazel doesn't support private dependencies and we want to avoid propagating these up
# to all users of libblkid and libuuid, so manually inject them one level up.
libcommon_hdrs_defines = [
    "_GNU_SOURCE",
    "HAVE_BYTESWAP_H",
    "HAVE_CLOSE_RANGE",
    "HAVE_CPU_SET_T",
    "HAVE_DECL_CPU_ALLOC",
    "HAVE_DIRFD",
    "HAVE_ENDIAN_H",
    "HAVE_ERR_H",
    "HAVE_ERR",
    "HAVE_ERRX",
    "HAVE_LOFF_T",
    "HAVE_MEMPCPY",
    "HAVE_NANOSLEEP",
    "HAVE_SETNS",
    "HAVE_SRANDOM",
    "HAVE_STDIO_EXT_H",
    "HAVE_STRNDUP",
    "HAVE_STRNLEN",
    "HAVE_SENDFILE",
    "HAVE_PIDFD_SEND_SIGNAL",
    "HAVE_PIDFD_OPEN",
    "HAVE_PATHS_H",
    "HAVE_LINUX_VERSION_H",
    "HAVE_OPENAT",
    "HAVE_SYS_IOCTL_H",
    "HAVE_SYS_SENDFILE_H",
    "HAVE_SYS_SYSMACROS_H",
    "HAVE_SYS_TTYDEFAULTS_H",
    "HAVE_TIMEGM",
    "HAVE_TIMER_CREATE",
    "HAVE_UNSHARE",
    "HAVE_WARN",
    "HAVE_WARNX",
    "HAVE_WIDECHAR",
    "HAVE_FSYNC",
    "HAVE___FPENDING",
]

template_file(
    name = "blkid.h",
    src = "libblkid/src/blkid.h.in",
    substitutions = {
        "@LIBBLKID_VERSION@": "0.0.0",
        "@LIBBLKID_DATE@": "01.01.1970",
    },
)

cc_library(
    name = "common",
    srcs = glob(["lib/*.h"]) + [
        "lib/blkdev.c",
        "lib/canonicalize.c",
        "lib/crc32.c",
        "lib/crc32c.c",
        "lib/env.c",
        "lib/idcache.c",
        "lib/encode.c",
        "lib/fileutils.c",
        "lib/color-names.c",
        "lib/mangle.c",
        "lib/match.c",
        "lib/mbsalign.c",
        "lib/mbsedit.c",
        "lib/md5.c",
        "lib/pager.c",
        "lib/procutils.c",
        "lib/pwdutils.c",
        "lib/randutils.c",
        "lib/setproctitle.c",
        "lib/strutils.c",
        "lib/sysfs.c",
        "lib/timeutils.c",
        "lib/ttyutils.c",
        "lib/strv.c",
        "lib/path.c",
        "lib/cpuset.c",
        "lib/sha1.c",
        "lib/signames.c",
    ],
    hdrs = glob(["include/*.h"]),
    # Locale-related defines are intentionally missing as we don't want locale support
    local_defines = libcommon_hdrs_defines + [
        "HAVE_DECL_CPU_ALLOC",
        "HAVE_ENVIRON_DECL",
        "HAVE_ERRNO_H",
        "HAVE_GETDTABLESIZE",
        "HAVE_GETRANDOM",
        "HAVE_GETRLIMIT",
        "HAVE_LINUX_CDROM_H",
        "HAVE_LINUX_FD_H",
        "HAVE_JRAND48",
        "HAVE_MKOSTEMP",
        "HAVE_SYS_PRCTL_H",
        "HAVE_MNTENT_H",
        "HAVE_PRCTL",
        "HAVE_SECURE_GETENV",
        "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC",
        "HAVE_SYS_STAT_H",
        "HAVE_SYS_TYPES_H",
        "HAVE_EXPLICIT_BZERO",
        "HAVE_UNISTD_H",
        "HAVE_TLS",
    ],
    visibility = ["//visibility:private"],
)

cc_library(
    name = "uuid",
    srcs = [
        "libuuid/src/clear.c",
        "libuuid/src/compare.c",
        "libuuid/src/copy.c",
        "libuuid/src/gen_uuid.c",
        "libuuid/src/isnull.c",
        "libuuid/src/pack.c",
        "libuuid/src/parse.c",
        "libuuid/src/predefined.c",
        "libuuid/src/unpack.c",
        "libuuid/src/unparse.c",
        "libuuid/src/uuidP.h",
        "libuuid/src/uuid_time.c",
    ],
    hdrs = [
        "libuuid/src/uuid.h",
        "libuuid/src/uuidd.h",
    ],
    local_defines = libcommon_hdrs_defines + [
        "HAVE_NET_IF_H",
        "HAVE_NETINET_IN_H",
        "HAVE_STDLIB_H",
        "HAVE_SYS_FILE_H",
        "HAVE_SYS_SOCKET_H",
        "HAVE_SYS_SYSCALL_H",
        "HAVE_SYS_TIME_H",
        "HAVE_SYS_UN_H",
        "HAVE_TLS",
        "HAVE_UNISTD_H",
    ],
    visibility = ["//visibility:public"],
    deps = [":common"],
)

cc_library(
    name = "blkid",
    srcs = glob([
        "libblkid/src/**/*.c",
        "libblkid/src/**/*.h",
    ]),
    hdrs = [":blkid.h"],
    local_defines = libcommon_hdrs_defines + [
        "LIBBLKID_VERSION=\\\"0.0.0\\\"",
        "LIBBLKID_DATE=\\\"01.01.1970\\\"",
        "HAVE_SYS_STAT_H",
        "HAVE_ERRNO_H",
        "HAVE_LINUX_CDROM_H",
        "HAVE_POSIX_FADVISE",
        "HAVE_STDLIB_H",
        "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC",
        "HAVE_SYS_STAT_H",
        "HAVE_SYS_TYPES_H",
        "HAVE_UNISTD_H",
    ],
    visibility = ["//visibility:public"],
    deps = ["//:common"],
)
