%YAML 1.2
--- |
  PHP_ARG_ENABLE(grpc, whether to enable grpc support,
  [  --enable-grpc           Enable grpc support])

  if test "$PHP_GRPC" != "no"; then
    dnl Write more examples of tests here...

    dnl # --with-grpc -> add include path
    PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/include)
    PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/src/core/ext/upb-generated)
    PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/src/core/ext/upbdefs-generated)
    PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/src/php/ext/grpc)
    PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/abseil-cpp)
    PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/address_sorting/include)
    PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/boringssl-with-bazel/src/include)
    PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/re2)
    PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/upb)
    PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/xxhash)

    LIBS="-lpthread $LIBS"

    CFLAGS="-Wall -Werror -Wno-parentheses-equality -Wno-unused-value -std=c11 -g -O2"
    CXXFLAGS="-std=c++11 -fno-exceptions -fno-rtti -g -O2"
    GRPC_SHARED_LIBADD="-lpthread $GRPC_SHARED_LIBADD"
    PHP_REQUIRE_CXX()
    PHP_ADD_LIBRARY(pthread)
    PHP_ADD_LIBRARY(dl,,GRPC_SHARED_LIBADD)
    PHP_ADD_LIBRARY(dl)

    case $host in
      *darwin*)
        PHP_ADD_LIBRARY(c++,1,GRPC_SHARED_LIBADD)
        ;;
      *)
        PHP_ADD_LIBRARY(stdc++,1,GRPC_SHARED_LIBADD)
        PHP_ADD_LIBRARY(rt,,GRPC_SHARED_LIBADD)
        PHP_ADD_LIBRARY(rt)
        ;;
    esac

    PHP_SUBST(GRPC_SHARED_LIBADD)
  <%
    srcs = []
    srcs.extend(php_config_m4.src)
    lib_maps = {lib.name: lib for lib in libs}
    php_deps = php_config_m4.get('deps', [])
    php_full_deps = []
    for dep in php_deps:
      php_full_deps.append(dep)
      php_full_deps.extend(lib_maps[dep].transitive_deps)
    for dep in set(php_full_deps) - set({'z'}):
      srcs.extend(lib_maps[dep].src)
    srcs = sorted(set(srcs))
  %>
    PHP_NEW_EXTENSION(grpc,
      % for src in srcs:
      ${src} ${"\\"}
      % endfor
      , $ext_shared, , -fvisibility=hidden ${"\\"}
      -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN ${"\\"}
      -D_HAS_EXCEPTIONS=0 -DNOMINMAX -DGRPC_ARES=0 ${"\\"}
      -DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK=1)
  <%
    dirs = sorted(set(src[:src.rfind('/')] for src in srcs))
  %>
    % for dir in dirs:
    PHP_ADD_BUILD_DIR($ext_builddir/${dir})
    % endfor
  fi
