%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/php/ext/grpc)
    PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/boringssl/include)
    PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/cares)
    PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/cares/cares)

    LIBS="-lpthread $LIBS"

    GRPC_SHARED_LIBADD="-lpthread $GRPC_SHARED_LIBADD"
    PHP_ADD_LIBRARY(pthread)

    PHP_ADD_LIBRARY(dl,,GRPC_SHARED_LIBADD)
    PHP_ADD_LIBRARY(dl)

    case $host in
      *darwin*)
        PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/cares/config_darwin)
        ;;
      *)
        PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/cares/config_linux)
        PHP_ADD_LIBRARY(rt,,GRPC_SHARED_LIBADD)
        PHP_ADD_LIBRARY(rt)
        ;;
    esac

    PHP_NEW_EXTENSION(grpc,
      % for source in php_config_m4.src:
      ${source} ${"\\"}
      % endfor
      % for lib in libs:
      % if lib.name in php_config_m4.get('deps', []):
      % for source in lib.src:
      ${source} ${"\\"}
      % endfor
      % endif
      % endfor
      , $ext_shared, , -Wall -Werror ${"\\"}
      -Wno-parentheses-equality -Wno-unused-value -std=c11 ${"\\"}
      -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN ${"\\"}
      -D_HAS_EXCEPTIONS=0 -DNOMINMAX)

    PHP_ADD_BUILD_DIR($ext_builddir/src/php/ext/grpc)
  <%
    dirs = {}
    for lib in libs:
      if lib.name in php_config_m4.get('deps', []):
        for source in lib.src:
          dirs[source[:source.rfind('/')]] = 1
    dirs = dirs.keys()
    dirs.sort()
  %>
    % for dir in dirs:
    PHP_ADD_BUILD_DIR($ext_builddir/${dir})
    % endfor
  fi
