distributable:
  url: git+https://github.com/grpc/grpc
  ref: v{{version}}

versions:
  github: grpc/grpc

provides:
  - bin/grpc_csharp_plugin
  - bin/grpc_node_plugin
  - bin/grpc_cpp_plugin
  - bin/grpc_python_plugin
  - bin/grpc_objective_c_plugin
  - bin/grpc_ruby_plugin
  - bin/grpc_php_plugin
  - bin/grpc_cli

dependencies:
  abseil.io: ^20240116
  c-ares.org: '*'
  openssl.org: ^1.1
  protobuf.dev: 26.1.0 # grpc links to specific versions, so we have to pick one.
  github.com/google/re2: '*'
  zlib.net: '*'
  linux:
    gnu.org/gcc/libstdcxx: '*'

build:
  dependencies:
    gnu.org/autoconf: '*'
    gnu.org/automake: '*'
    gnu.org/libtool: '*'
    darwin:
      gnu.org/patch: '*'
    cmake.org: ^3
    freedesktop.org/pkg-config: ^0
    git-scm.org: ^2
  working-directory: cmake/build
  script:
    - run: git submodule update --init --recursive
      working-directory: ../..

    # darwin issues:
    # https://github.com/grpc/grpc/issues/36654
    - run: |
        if test "{{hw.platform}}" = "darwin"; then
          patch -i $PROP || true
        fi
      if: '>=1.63'
      working-directory: ../..
      prop: |
        --- CMakeLists.txt.orig	2024-05-16 01:01:03.000000000 +0000
        +++ CMakeLists.txt
        @@ -3682,6 +3682,7 @@ target_include_directories(upb_json_lib
         )
         target_link_libraries(upb_json_lib
           ${_gRPC_ALLTARGETS_LIBRARIES}
        +  grpc++_unsecure
           utf8_range_lib
           upb_message_lib
         )
        @@ -3883,6 +3884,7 @@ target_include_directories(upb_textforma
         )
         target_link_libraries(upb_textformat_lib
           ${_gRPC_ALLTARGETS_LIBRARIES}
        +  grpc++_unsecure
           utf8_range_lib
           upb_message_lib
         )

    - cmake $COMMON_ARGS $ARGS ../..
    - make install

    # Build the cli
    - cmake $COMMON_ARGS $CLI_ARGS ../..
    - make grpc_cli

    - cp grpc_cli "{{prefix}}/bin"
    - cp libgrpc++_test_config.* "{{prefix}}/lib"

    # grpc has libs and binaries that end up with name @rpath/libgrpc_plugin_support.{{version}}.dylib (offset 24)
    # so we need to add @loader_path to the rpath
    - run: |
        for f in bin/* lib/libgrpc++_test_config.dylib; do
          if test -f $f && ! otool -l $f | grep @loader_path/../lib; then
            install_name_tool -add_rpath @loader_path/../lib $f
          fi
        done
      working-directory: '{{prefix}}'
      if: darwin

  env:
    COMMON_ARGS:
      - -DCMAKE_BUILD_TYPE=Release
      - -DCMAKE_INSTALL_PREFIX="{{prefix}}"
      - -DCMAKE_INSTALL_RPATH={{prefix}}
      - -DBUILD_SHARED_LIBS=ON
    ARGS:
      - -DCMAKE_CXX_STANDARD=17
      - -DCMAKE_CXX_STANDARD_REQUIRED=TRUE
      - -DgRPC_BUILD_TESTS=OFF
      - -DgRPC_INSTALL=ON
      - -DgRPC_ABSL_PROVIDER=package
      - -DgRPC_CARES_PROVIDER=package
      - -DgRPC_SSL_PROVIDER=package
      - -DgRPC_ZLIB_PROVIDER=package
      - -DgRPC_RE2_PROVIDER=package
    CLI_ARGS:
      - -DgRPC_BUILD_TESTS=ON
    darwin:
      ARGS:
        - -DgRPC_PROTOBUF_PROVIDER=module
    linux:
      CC: clang
      CXX: clang++
      LD: clang
      ARGS:
        - -DgRPC_PROTOBUF_PROVIDER=package
      CLI_ARGS:
        # otherwise we get linker errors
        - -DCMAKE_EXE_LINKER_FLAGS=-W,-labsl_log_internal_message

test:
  dependencies:
    freedesktop.org/pkg-config: ^0
  fixture: |
    #include <grpc/grpc.h>
    int main() {
      grpc_init();
      grpc_shutdown();
      return GRPC_STATUS_OK;
    }
  script:
    - cp $FIXTURE test.cpp
    - PKG_CONFIG=$(pkg-config --cflags --libs libcares protobuf re2 grpc++)
    - clang++ $PKG_CONFIG test.cpp -o test $LIBS
    - ./test
    - (grpc_cli ls localhost:58931 2>&1 || true) | grep -E "(failed to connect to all addresses|rpc failed)"
  env:
    linux:
      LIBS: -lstdc++
