# Protobuf PHP runtime
#
# See also code generation logic under /src/google/protobuf/compiler/php.

load("@rules_pkg//:mappings.bzl", "pkg_files", "pkg_filegroup", "strip_prefix")
load("@rules_pkg//:pkg.bzl", "pkg_tar")
load("@upb//cmake:build_defs.bzl", "staleness_test")
load("//build_defs:internal_shell.bzl", "inline_sh_binary")
load("//conformance:defs.bzl", "conformance_test")
load("//:protobuf_version.bzl", "PROTOBUF_PHP_VERSION", "PROTOC_VERSION")

filegroup(
    name = "source_files",
    visibility = [
        "//conformance:__pkg__",
        "//php:__pkg__",
    ],
    srcs = glob([
        "src/GPBMetadata/Google/Protobuf/**/*.php",
        "src/Google/Protobuf/**/*.php",
    ]) + [
        "composer.json",
        ":php_ext_source_files",
    ],
)

################################################################################
# PHP Extension
################################################################################

inline_sh_binary(
    name = "build_extension",
    cmd = """
        mkdir -p php/ext/google/protobuf/third_party/utf8_range
        cp external/utf8_range/* php/ext/google/protobuf/third_party/utf8_range

        pushd  php/ext/google/protobuf
        phpize
        ./configure --with-php-config=$$(which php-config)
        make
        popd
    """,
)

genrule(
    name = "extension",
    srcs = [
        ":source_files",
        "@utf8_range//:utf8_range_srcs",
    ],
    tools = [":build_extension"],
    outs = ["protobuf.so"],
    cmd = """
        ./$(execpath :build_extension) $@
        cp php/ext/google/protobuf/modules/protobuf.so $(OUTS)
    """,
    visibility = ["//visibility:public"],
)

################################################################################
# Tests
################################################################################

conformance_test(
    name = "conformance_test",
    failure_list = "//conformance:failure_list_php.txt",
    testee = "//conformance:conformance_php",
    text_format_failure_list = "//conformance:text_format_failure_list_php.txt",
    target_compatible_with = select({
        "@platforms//os:osx": ["@platforms//:incompatible"],
        "//conditions:default": [],
    }),
)

conformance_test(
    name = "conformance_test_c",
    failure_list = "//conformance:failure_list_php_c.txt",
    testee = "//conformance:conformance_php_c",
    text_format_failure_list = "//conformance:text_format_failure_list_php.txt",
    target_compatible_with = select({
        "@platforms//os:osx": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
)

genrule(
    name = "copy_php_amalgamation_h",
    srcs = ["@upb//:php-upb.h"],
    outs = ["generated-in/ext/google/protobuf/php-upb.h"],
    cmd = "cp $< $@",
)

genrule(
    name = "copy_php_amalgamation_c",
    srcs = ["@upb//:php-upb.c"],
    outs = ["generated-in/ext/google/protobuf/php-upb.c"],
    cmd = "cp $< $@",
)

staleness_test(
    name = "test_amalgamation_staleness",
    outs = [
        "ext/google/protobuf/php-upb.h",
        "ext/google/protobuf/php-upb.c",
    ],
    generated_pattern = "generated-in/%s",
)

################################################################################
# Distribution files
################################################################################

pkg_files(
    name = "dist_files",
    srcs = glob([
        "ext/google/protobuf/**/*",
        "tests/*.php",
        "tests/*.sh",
        "tests/generated_previous/**/*.php",
        "tests/proto/**/*.proto",
        "tests/proto_previous/*.proto",
    ]) + [
        ":source_files",
        "BUILD.bazel",
        "README.md",
        "REFCOUNTING.md",
        "composer.json",
        "generate_descriptor_protos.sh",
        "generate_test_protos.sh",
        "release.sh",
        "src/phpdoc.dist.xml",
        "tests/valgrind.supp",
    ],
    prefix = "php",
    strip_prefix = strip_prefix.from_pkg(""),
    visibility = ["//pkg:__pkg__"],
)

################################################################################
# PECL .tgz Release
################################################################################

pkg_files(
  name = "php_ext_source_files",
  srcs = glob([
    "ext/google/protobuf/*.h",
    "ext/google/protobuf/*.c",
  ]) + [
    "//:LICENSE",
    "ext/google/protobuf/config.m4",
    "ext/google/protobuf/wkt.inc",
  ],
)

pkg_files(
  name = "utf8_range_files",
  srcs = [
    "@utf8_range//:utf8_range_srcs",
    "@utf8_range//:LICENSE",
  ],
  prefix = "third_party/utf8_range",
)

pkg_filegroup(
  name = "pecl_release_files",
  srcs = [
    ":php_ext_source_files",
    ":utf8_range_files",
  ],
  prefix = "protobuf-%s" % PROTOBUF_PHP_VERSION,
)

# PECL .tgz without package.xml
pkg_tar(
  name = "release_without_package",
  extension = "tgz",
  srcs = [
    ":pecl_release_files",
  ],
  out = "release_without_package.tgz",
)

# Generate PECL package.xml
genrule(
    name = "generate_package_xml",
    srcs = [
      ":release_without_package",
      "ext/google/protobuf/template_package.xml",
    ],
    outs = ["package.xml"],
    cmd = " ".join([
      "$(location ext/google/protobuf/generate_package_xml.sh)",
      "$(location ext/google/protobuf/template_package.xml)",
      PROTOBUF_PHP_VERSION,
      PROTOC_VERSION,
      "$$(tar -tf $(location :release_without_package) | sed -z -e 's;\\n;,;g')",
      "$(location package.xml)"
    ]),
    tools = ["ext/google/protobuf/generate_package_xml.sh"],
)

pkg_tar(
  name = "release",
  extension = "tgz",
  srcs = [
    ":pecl_release_files",
    ":generate_package_xml",
  ],
  out = "protobuf-%s.tgz" % PROTOBUF_PHP_VERSION,
)