load("//tools:defs.bzl", "go_binary", "pkg_deb", "pkg_tar")

package(licenses = ["notice"])

go_binary(
    name = "runsc",
    srcs = [
        "main.go",
        "version.go",
    ],
    pure = True,
    visibility = [
        "//visibility:public",
    ],
    x_defs = {"main.version": "{STABLE_VERSION}"},
    deps = [
        "//pkg/log",
        "//pkg/refs",
        "//pkg/sentry/platform",
        "//runsc/boot",
        "//runsc/cmd",
        "//runsc/flag",
        "//runsc/specutils",
        "@com_github_google_subcommands//:go_default_library",
    ],
)

# The runsc-race target is a race-compatible BUILD target. This must be built
# via: bazel build --features=race :runsc-race
#
# This is neccessary because the race feature must apply to all dependencies
# due a bug in gazelle file selection.  The pure attribute must be off because
# the race detector requires linking with non-Go components, although we still
# require a static binary.
#
# Note that in the future this might be convertible to a compatible target by
# using the pure and static attributes within a select function, but select is
# not currently compatible with string attributes [1].
#
# [1] https://github.com/bazelbuild/bazel/issues/1698
go_binary(
    name = "runsc-race",
    srcs = [
        "main.go",
        "version.go",
    ],
    static = True,
    visibility = [
        "//visibility:public",
    ],
    x_defs = {"main.version": "{STABLE_VERSION}"},
    deps = [
        "//pkg/log",
        "//pkg/refs",
        "//pkg/sentry/platform",
        "//runsc/boot",
        "//runsc/cmd",
        "//runsc/flag",
        "//runsc/specutils",
        "@com_github_google_subcommands//:go_default_library",
    ],
)

pkg_tar(
    name = "runsc-bin",
    srcs = [":runsc"],
    mode = "0755",
    package_dir = "/usr/bin",
    strip_prefix = "/runsc/linux_amd64_pure_stripped",
)

pkg_tar(
    name = "debian-data",
    extension = "tar.gz",
    deps = [
        ":runsc-bin",
    ],
)

genrule(
    name = "deb-version",
    # Note that runsc must appear in the srcs parameter and not the tools
    # parameter, otherwise it will not be stamped. This is reasonable, as tools
    # may be encoded differently in the build graph (cached more aggressively
    # because they are assumes to be hermetic).
    srcs = [":runsc"],
    outs = ["version.txt"],
    # Note that the little dance here is necessary because files in the $(SRCS)
    # attribute are not executable by default, and we can't touch in place.
    cmd = "cp $(location :runsc) $(@D)/runsc && \
        chmod a+x $(@D)/runsc && \
        $(@D)/runsc -version | grep version | sed 's/^[^0-9]*//' > $@ && \
        rm -f $(@D)/runsc",
    stamp = 1,
)

pkg_deb(
    name = "runsc-debian",
    architecture = "amd64",
    data = ":debian-data",
    # Note that the description_file will be flatten (all newlines removed),
    # and therefore it is kept to a simple one-line description. The expected
    # format for debian packages is "short summary\nLonger explanation of
    # tool." and this is impossible with the flattening.
    description_file = "debian/description",
    homepage = "https://gvisor.dev/",
    maintainer = "The gVisor Authors <gvisor-dev@googlegroups.com>",
    package = "runsc",
    postinst = "debian/postinst.sh",
    version_file = ":version.txt",
    visibility = [
        "//visibility:public",
    ],
)

sh_test(
    name = "version_test",
    size = "small",
    srcs = ["version_test.sh"],
    args = ["$(location :runsc)"],
    data = [":runsc"],
    tags = ["noguitar"],
)