# Contributor: Keith Maxwell <keith.maxwell@gmail.com>
# Contributor: wener <wenermail@gmail.com>
# Maintainer: wener <wenermail@gmail.com>
pkgname=grpc
pkgver=1.72.0
pkgrel=0
pkgdesc="The C based gRPC"
url="https://grpc.io/"
arch="all"
# BSD-3-Clause: third_party/upb, third_party/address_sorting
# MIT: third_party/upb/third_party/utf8_range
license="Apache-2.0 AND BSD-3-Clause AND MIT"
depends="ca-certificates"
depends_dev="
	$pkgname-cpp=$pkgver-r$pkgrel
	$pkgname-plugins=$pkgver-r$pkgrel
	"
_pythondepends="
	cython
	python3-dev
	py3-setuptools
	"
makedepends="
	abseil-cpp-dev
	autoconf
	automake
	bash
	benchmark-dev
	c-ares-dev
	chrpath
	cmake
	libstdc++
	libtool
	linux-headers
	openssl-dev>3
	protobuf-dev
	re2-dev
	samurai
	yaml-dev
	xxhash-dev
	zlib-dev
	$_pythondepends
	"
checkdepends="coreutils python3 py3-six"
subpackages="
	$pkgname-dev
	$pkgname-cpp
	$pkgname-plugins
	$pkgname-doc
	py3-grpcio-pyc
	py3-grpcio:grpcio
	libaddress_sorting:lib
	libgpr:lib
	libgrpc:lib
	libgrpc_authorization_provider:lib
	libgrpc_unsecure:lib
	libupb_base_lib:lib
	libupb_json_lib:lib
	libupb_mem_lib:lib
	libupb_message_lib:lib
	libupb_textformat_lib:lib
	"
_googletest_rev=52204f78f94d7512df1f0f3bea1d47437a2c3a58

source="https://github.com/grpc/grpc/archive/v$pkgver/grpc-v$pkgver.tar.gz
	googletest-$_googletest_rev.tar.gz::https://github.com/google/googletest/archive/$_googletest_rev.tar.gz
	01-chttp2-maybe-uninitialized.patch
	02-warning-inline.patch
	disable-sse2-on-arm.patch
	find-dependency.patch
	"
options="net !check" # sometimes hang indefinitely on builders

# secfixes:
#   1.59.3-r0:
#     - CVE-2023-44487

prepare() {
	rm -r third_party/googletest
	mv "$srcdir"/googletest-$_googletest_rev third_party/googletest

	# Remove bundled xxhash.
	# Since grpc sets XXH_INCLUDE_ALL wherever it uses xxhash, it is using xxhash
	# as a header-only library. This means we can replace it with the system copy
	# by doing nothing further; xxhash.h is in the system include path and will be
	# found instead, and there are no linker flags to add. See also
	# https://github.com/grpc/grpc/issues/25945.
	rm -rvf third_party/xxhash/*

	# This will be replaced with a symlink to system certs.
	echo '' > etc/roots.pem

	default_prepare

	# Remove some bundled dependencies from the gem's files list.
	sed -i \
		-e '/etc\/roots.pem/d' \
		-e '/third_party\/abseil/d' \
		-e '/third_party\/boringssl/d' \
		-e '/third_party\/cares/d' \
		-e '/third_party\/re2/d' \
		-e '/third_party\/xxhash/d' \
		-e '/third_party\/zlib/d' \
		grpc.gemspec

	# Remove unused dependency from gemspec - it's not required anyhwere,
	# it's just Google pushing their crap everywhere...
	sed -i '/add_dependency.*googleapis-common-protos-types/d' \
		grpc.gemspec
}

build() {
	export CFLAGS="$CFLAGS -flto=auto -DNDEBUG -O2"
	export CXXFLAGS="$CXXFLAGS -flto=auto -DNDEBUG -O2"
	cmake -B _build -G Ninja \
		-DCMAKE_BUILD_TYPE=None \
		-DCMAKE_INSTALL_PREFIX=/usr \
		-DCMAKE_CXX_STANDARD=17 \
		-DBUILD_SHARED_LIBS=True \
		-DgRPC_INSTALL=ON \
		-DgRPC_CARES_PROVIDER=package \
		-DgRPC_PROTOBUF_PROVIDER=package \
		-DgRPC_SSL_PROVIDER=package \
		-DgRPC_ZLIB_PROVIDER=package \
		-DgRPC_ABSL_PROVIDER=package \
		-DgRPC_BENCHMARK_PROVIDER=package \
		-DgRPC_RE2_PROVIDER=package \
		-DgRPC_USE_SYSTEMD=OFF \
		-DgRPC_BACKWARDS_COMPATIBILITY_MODE=OFF \
		-DgRPC_BUILD_TESTS="$(want_check && echo ON || echo OFF)"
	cmake --build _build

	GRPC_PYTHON_CFLAGS="-std=c++17" \
	GRPC_PYTHON_DISABLE_LIBC_COMPATIBILITY=1 \
	GRPC_PYTHON_BUILD_SYSTEM_CARES=1 \
	GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 \
	GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1 \
	GRPC_PYTHON_BUILD_SYSTEM_RE2=1 \
	GRPC_PYTHON_BUILD_SYSTEM_ABSL=1 \
	python3 setup.py build
}

check() {
	# delete times out in ci or broken for ci tests
	rm -f _build/spinlock_test _build/resolve_address_using_ares_resolver_posix_test build/resolve_address_using_native_resolver_posix_test
	rm -f _build/flaky_network_test _build/unknown_frame_bad_client_test _build/ssl_transport_security_test _build/httpscli_test
	rm -f _build/headers_bad_client_test _build/httpcli_test
	case $CARCH in
		aarch64|ppc64le) rm -f _build/server_test _build/grpc_tool_test ;;
		s390x) rm -f _build/client_lb_end2end_test _build/alts_frame_protector_test _build/alts_iovec_record_protocol_test ;;
		armv7) rm -f _build/initial_settings_frame_bad_client_test ;;
		x86) rm -f _build/time_jump_test _build/connection_prefix_bad_client_test ;;
	esac

	# start helper
	./tools/run_tests/start_port_server.py &
	find build/ -maxdepth 1 -type f -executable -name "*_test" -exec {} \;
	# kill helper
	pkill -9 python3
}

package() {
	DESTDIR="$pkgdir" cmake --install _build
	python3 setup.py install --skip-build --root="$pkgdir"

	cd doc
	find ./ -type f -print -exec install -Dm644 {} "$pkgdir"/usr/share/doc/grpc/{} \;
	rm "$pkgdir"/usr/share/doc/grpc/.gitignore

	find "$pkgdir" -type f -name roots.pem -exec \
		sh -c 'rm $0 && ln -s /etc/ssl/certs/ca-certificates.crt $0' "{}" \;
}

cpp() {
	pkgdesc="C++ language bindings for gRPC"
	depends="$pkgname=$pkgver-r$pkgrel"

	amove usr/lib/libgrpc++*.so.*
	amove usr/lib/libgrpc_plugin_support.so.*
	amove usr/lib/libgrpcpp*.so.*
}

plugins() {
	pkgdesc="Protocol buffers compiler plugins for gRPC"
	depends="$pkgname-cpp=$pkgver-r$pkgrel protobuf"

	amove usr/bin/grpc_*_plugin
}

cli() {
	pkgdesc="gRPC command line tool"

	install -Dm644 -t "$subpkgdir"/usr/lib "$builddir"/_build/libgrpc++_test_config.so.$pkgver
	install -Dm755 -t "$subpkgdir"/usr/bin "$builddir"/_build/grpc_cli

	# Fix "Has /home/... in rpath"
	chrpath -d "$subpkgdir"/usr/lib/libgrpc++_test_config.so.$pkgver
	chrpath -d "$subpkgdir"/usr/bin/grpc_cli
}

grpcio() {
	pkgdesc="gRPC Python HTTP/2-based RPC framework"
	depends="py3-six"

	amove usr/lib/python3*
}

lib() {
	pkgdesc="$pkgdesc ($subpkgname library)"
	depends="$pkgname=$pkgver-r$pkgrel"

	amove usr/lib/$subpkgname.so.*
}

sha512sums="
e56c37f6b2370426df63e700d9cf227864812911ae071f1c34626d0c336d6b6b42ca5d7cdc6d5d04744009aca6be8769fe9b0f15992f3aa2112e6166ed326f6a  grpc-v1.72.0.tar.gz
a24d71b1f0a4a54e98da9b1fab80a4402f0dff508bc901bf75976ccc3fbe9fb4a022e5be91b96619bec27ddfb047ff44ff4b5b1c42bb7c79e2b1c48c18fd7436  googletest-52204f78f94d7512df1f0f3bea1d47437a2c3a58.tar.gz
b22c054cd826e1e5d5c4f985e34747afc46ebb35cef6351816f9bd7a049664f91af0f661686b809a98ef01a91b92ce96473aea1170e6f657338feaa36aaf7a63  01-chttp2-maybe-uninitialized.patch
c9d31422887506037e8925c6e3de713c7e2962956facbd56b54ddb2f763404c2f7e890d7fb0ba3237c40ac7e8be031c0170ee96b43d285998afaba0453546106  02-warning-inline.patch
36cad27e8d4aa8df7f6b7774c1f9b14eb2bd8f0263cc58f24300fcf853e0028d719bff7952b03cd8d3bc082df09388453865abb3d2e14c89c193f44d34166254  disable-sse2-on-arm.patch
6702e39c6a3c065fe4ff5ae48898057135c09bf6851e35fc958cf95ee5d77e9dd34e8c34d978efe60682384e46c4c4b2e51156d546b06a0eb1feed89adcc024b  find-dependency.patch
"
