Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update gRPC C core to v1.29.1 #466

Merged
merged 21 commits into from
Jun 11, 2020
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ on:
env:
RUST_BACKTRACE: 1
RUSTFLAGS: "--deny=warnings"
GRPC_VERSION: 1.26.0
GRPC_VERSION: 1.29.1

jobs:
Linux-Format-PKG-Test:
Expand Down Expand Up @@ -51,8 +51,8 @@ jobs:
- uses: actions/checkout@v2
- run: which go && go version && which cargo && cargo version && clang --version && openssl version
- run: scripts/reset-submodule.cmd
- run: cargo test --features "openssl" --all
- run: cargo test --features "openssl-vendored" --all
- run: cargo test --features "openssl" --all

Linux-Nightly:
name: Linux-Nightly
Expand Down
4 changes: 2 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
arch: arm64
before_script:
- scripts/reset-submodule.cmd
- export GRPC_VERSION=1.26.0
- export GRPC_VERSION=1.29.1
- export PATH="$PATH:$HOME/.cache/bin:$HOME/.cargo/bin"
- GRPC_HEADER="$HOME/.cache/include/grpc/grpc.h"
- if [[ ! -f "$GRPC_HEADER" ]] ; then
Expand All @@ -58,7 +58,7 @@ jobs:
arch: arm64
before_script:
- scripts/reset-submodule.cmd
- export GRPC_VERSION=1.26.0
- export GRPC_VERSION=1.29.1
- export PATH="$PATH:$HOME/.cache/bin:$HOME/.cargo/bin"
- GRPC_HEADER="$HOME/.cache/include/grpc/grpc.h"
- sudo apt-get update && sudo apt-get -y install libssl-dev;
Expand Down
9 changes: 2 additions & 7 deletions grpc-sys/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,6 @@ exclude = [
"grpc/third_party/abseil-cpp/*",
"grpc/third_party/benchmark/*",
"grpc/third_party/bloaty/*",
"grpc/third_party/boringssl/fuzz/*",
"grpc/third_party/boringssl/crypto/cipher_extra/test/*",
"grpc/third_party/boringssl/third_party/android-cmake/*",
"grpc/third_party/boringssl/third_party/wycheproof_testvectors",
"grpc/third_party/boringssl/third_party/googletest",
"!grpc/third_party/boringssl/third_party/googletest/src/gtest-all.cc",
"grpc/third_party/boringssl-with-bazel/*",
"grpc/third_party/gflags/*",
"grpc/third_party/googletest/*",
Expand All @@ -46,6 +40,7 @@ exclude = [
"grpc/third_party/protobuf/*",
"grpc/third_party/rake-compiler-dock/*",
"grpc/third_party/toolchan/*",
"grpc/third_party/abseil-cpp/*",
"grpc/tools/run_tests/generated/*",
"grpc/test/core/",
"!grpc/test/core/security/*.cc",
Expand All @@ -67,7 +62,7 @@ no-omit-frame-pointer = []

[build-dependencies]
cc = "1.0"
cmake = "0.1.40"
cmake = "0.1"
pkg-config = "0.3"
walkdir = "2.2.9"
# Because of rust-lang/cargo#5237, bindgen should not be upgraded util a minor or major release.
Expand Down
182 changes: 143 additions & 39 deletions grpc-sys/bindings/aarch64-unknown-linux-gnu-bindings.rs

Large diffs are not rendered by default.

182 changes: 143 additions & 39 deletions grpc-sys/bindings/x86_64-unknown-linux-gnu-bindings.rs

Large diffs are not rendered by default.

123 changes: 60 additions & 63 deletions grpc-sys/build.rs
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
// Copyright 2019 TiKV Project Authors. Licensed under Apache-2.0.

extern crate cc;
extern crate cmake;
extern crate pkg_config;

use std::env::VarError;
use std::io::prelude::*;
use std::io::BufReader;
use std::path::{Path, PathBuf};
use std::{env, fs, io};

use cc::Build;
use cmake::Config;
use cmake::Config as CmakeConfig;
use pkg_config::{Config as PkgConfig, Library};
use walkdir::WalkDir;

const GRPC_VERSION: &str = "1.26.0";
const GRPC_VERSION: &str = "1.29.1";

fn probe_library(library: &str, cargo_metadata: bool) -> Library {
match PkgConfig::new()
Expand All @@ -33,10 +28,11 @@ fn prepare_grpc() {
"grpc",
"grpc/third_party/cares/cares",
"grpc/third_party/address_sorting",
"grpc/third_party/abseil-cpp",
];

if cfg!(feature = "secure") {
modules.push("grpc/third_party/boringssl");
if cfg!(feature = "secure") && !cfg!(feature = "openssl") {
modules.push("grpc/third_party/boringssl-with-bazel");
}

for module in modules {
Expand All @@ -63,22 +59,32 @@ fn trim_start<'a>(s: &'a str, prefix: &str) -> Option<&'a str> {
}
}

fn build_grpc(cc: &mut Build, library: &str) {
fn build_grpc(cc: &mut cc::Build, library: &str) {
prepare_grpc();

let mut third_party = vec!["cares/cares/lib"];
let mut third_party = vec![
"cares/cares/lib",
"abseil-cpp/absl/strings",
"abseil-cpp/absl/time",
"abseil-cpp/absl/base",
"abseil-cpp/absl/types",
"abseil-cpp/absl/numeric",
];

let dst = {
let mut config = Config::new("grpc");
if !cfg!(feature = "secure") {
// boringssl's configuration is still included, but targets
// will never be built, hence specify a fake go to get rid of
// the unnecessary dependency.
config.define("GO_EXECUTABLE", "fake-go-nonexist");
}
let mut config = CmakeConfig::new("grpc");

if get_env("CARGO_CFG_TARGET_OS").map_or(false, |s| s == "macos") {
config.cxxflag("-stdlib=libc++");
}

// Ensure CoreFoundation be found in macos or ios
if get_env("CARGO_CFG_TARGET_OS").map_or(false, |s| s == "macos")
|| get_env("CARGO_CFG_TARGET_OS").map_or(false, |s| s == "ios")
{
println!("cargo:rustc-link-lib=framework=CoreFoundation");
}

if env::var("CARGO_CFG_TARGET_ENV").unwrap() == "musl" {
config.define("CMAKE_CXX_COMPILER", "g++");
}
Expand Down Expand Up @@ -129,10 +135,11 @@ fn build_grpc(cc: &mut Build, library: &str) {
config.define("gRPC_BENCHMARK_PROVIDER", "none");
if cfg!(feature = "openssl") {
config.define("gRPC_SSL_PROVIDER", "package");
config.define("EMBED_OPENSSL", "false");
setup_openssl(&mut config)
if cfg!(feature = "openssl-vendored") {
config.register_dep("openssl");
}
} else if cfg!(feature = "secure") {
third_party.extend_from_slice(&["boringssl/ssl", "boringssl/crypto"]);
third_party.extend_from_slice(&["boringssl-with-bazel"]);
}
if cfg!(feature = "no-omit-frame-pointer") {
config
Expand All @@ -141,7 +148,7 @@ fn build_grpc(cc: &mut Build, library: &str) {
}
// Uses zlib from libz-sys.
setup_libz(&mut config);
config.build_target(library).uses_cxx11().build()
config.build_target(library).build()
};

let build_dir = format!("{}/build", dst.display());
Expand All @@ -167,10 +174,33 @@ fn build_grpc(cc: &mut Build, library: &str) {
}
}

// link libz
println!("cargo:rustc-link-lib=static=z");
// link cares
println!("cargo:rustc-link-lib=static=cares");
println!("cargo:rustc-link-lib=static=gpr");
// link address_sorting
println!("cargo:rustc-link-lib=static=address_sorting");
// link absl/base
println!("cargo:rustc-link-lib=static=absl_base");
println!("cargo:rustc-link-lib=static=absl_raw_logging_internal");
println!("cargo:rustc-link-lib=static=absl_dynamic_annotations");
println!("cargo:rustc-link-lib=static=absl_throw_delegate");
println!("cargo:rustc-link-lib=static=absl_log_severity");
println!("cargo:rustc-link-lib=static=absl_spinlock_wait");
// link absl/strings
println!("cargo:rustc-link-lib=static=absl_strings");
println!("cargo:rustc-link-lib=static=absl_strings_internal");
println!("cargo:rustc-link-lib=static=absl_str_format_internal");
// link absl/time
println!("cargo:rustc-link-lib=static=absl_civil_time");
println!("cargo:rustc-link-lib=static=absl_time_zone");
println!("cargo:rustc-link-lib=static=absl_time");
// link absl/types
println!("cargo:rustc-link-lib=static=absl_bad_optional_access");
// link absl/numeric
println!("cargo:rustc-link-lib=static=absl_int128");
// link grpc related lib
println!("cargo:rustc-link-lib=static=gpr");
println!("cargo:rustc-link-lib=static=upb");
println!("cargo:rustc-link-lib=static={}", library);

Expand Down Expand Up @@ -213,7 +243,7 @@ fn figure_ssl_path(build_dir: &str) {
println!("cargo:rustc-link-lib=crypto");
}

fn setup_libz(config: &mut Config) {
fn setup_libz(config: &mut CmakeConfig) {
config.define("gRPC_ZLIB_PROVIDER", "package");
config.register_dep("Z");
// cmake script expect libz.a being under ${DEP_Z_ROOT}/lib, but libz-sys crate put it
Expand All @@ -230,39 +260,6 @@ fn setup_libz(config: &mut Config) {
env::set_var("CMAKE_PREFIX_PATH", prefix_path);
}

#[cfg(feature = "openssl-vendored")]
fn setup_openssl(config: &mut Config) {
// openssl-sys uses openssl-src to build the library. openssl-src uses
// configure/make to build the library which makes it hard to detect
// what's the actual path of the library. Here assumes the directory
// structure as follow (which is the behavior of 0.9.47):
// install_dir/
// include/
// lib/
// Remove the hack when sfackler/rust-openssl#1117 is resolved.
config.register_dep("openssl");
if env::var("DEP_OPENSSL_ROOT").is_err() {
let include_str = env::var("DEP_OPENSSL_INCLUDE").unwrap();
let include_dir = Path::new(&include_str);
let root_dir = format!("{}", include_dir.parent().unwrap().display());
env::set_var("DEP_OPENSSL_ROOT", &root_dir);
}
}

#[cfg(not(feature = "openssl-vendored"))]
fn setup_openssl(config: &mut Config) {
// check if openssl provided from system support ALPN
if Build::new()
.file("grpc/test/build/openssl-alpn.c")
.cargo_metadata(false)
.cpp(true)
.try_compile("check_alpn")
.is_err()
{
config.cxxflag("-DTSI_OPENSSL_ALPN_SUPPORT=0");
}
}

fn get_env(name: &str) -> Option<String> {
println!("cargo:rerun-if-env-changed={}", name);
match env::var(name) {
Expand Down Expand Up @@ -369,7 +366,9 @@ fn main() {
println!("cargo:rerun-if-changed=grpc");
println!("cargo:rerun-if-env-changed=UPDATE_BIND");

let mut cc = Build::new();
// create a builder to compile grpc_wrap.cc
let mut cc = cc::Build::new();
// create a config to generate binding file
let mut bind_config = bindgen::Builder::default();

let library = if cfg!(feature = "secure") {
Expand All @@ -381,9 +380,9 @@ fn main() {
};

if get_env("CARGO_CFG_TARGET_OS").map_or(false, |s| s == "windows") {
// At lease win7
cc.define("_WIN32_WINNT", Some("0x0700"));
bind_config = bind_config.clang_arg("-D _WIN32_WINNT=0x0700");
// At lease vista
cc.define("_WIN32_WINNT", Some("0x600"));
bind_config = bind_config.clang_arg("-D _WIN32_WINNT=0x600");
}

if get_env("GRPCIO_SYS_USE_PKG_CONFIG").map_or(false, |s| s == "1") {
Expand All @@ -401,9 +400,7 @@ fn main() {
cc.flag("-std=c++11");
}
cc.file("grpc_wrap.cc");

cc.warnings_into_errors(true);

cc.compile("libgrpc_wrap.a");

config_binding_path(bind_config);
Expand Down
2 changes: 1 addition & 1 deletion grpc-sys/grpc
Submodule grpc updated from d6347b to 2808d6
3 changes: 2 additions & 1 deletion scripts/reset-submodule.cmd
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
git submodule update --init grpc-sys/grpc
cd grpc-sys/grpc
git submodule update --init third_party/boringssl
git submodule update --init third_party/boringssl-with-bazel
git submodule update --init third_party/cares/cares
git submodule update --init third_party/abseil-cpp
cd third_party/zlib
git clean -f
git reset --hard
37 changes: 24 additions & 13 deletions tests-and-examples/certs/client1.crt
Original file line number Diff line number Diff line change
@@ -1,15 +1,26 @@
-----BEGIN CERTIFICATE-----
MIICTzCCAbgCFGliNNeTKbKSUv7jbi+4PF0yE9DUMA0GCSqGSIb3DQEBCwUAMF8x
CzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdCZWlqaW5n
MRAwDgYDVQQKDAdQaW5nQ0FQMQ0wCwYDVQQLDARUaUtWMQswCQYDVQQDDAJDQTAg
Fw0yMDAzMDcxMTA1NDRaGA8yMDc0MTIwOTExMDU0NFowbDELMAkGA1UEBhMCQ04x
ETAPBgNVBAgMCFNoYW5naGFpMREwDwYDVQQHDAhTaGFuZ2hhaTEQMA4GA1UECgwH
UGluZ0NBUDENMAsGA1UECwwEVGlLVjEWMBQGA1UEAwwNZ3JwYy1jbGllbnQtMTCB
nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1oCOEdTujz8Szi/dNAuRnFBuW2zO
26/uOfv4EJocVIQ2CSuD1bgGIgUeiURPmEcaawy6jKlP4Rk2Uon1zZ+DquOHx2vX
Xq/TEX6LTCZDdLLDZ0M0gshq0/0MVvSQa1uNLG+yOdiotCo44aWwVqOkzmRtnuFt
OZ0+oKnYQojIG1kCAwEAATANBgkqhkiG9w0BAQsFAAOBgQCg2DOBoq6Ty8RL08KG
aBQLz+jWJTdD8eZOfJvffa1j5NntPHWa1Ei4giQtamChoCJ5EAAp7Qx2JLE8OmQD
gFlHzsMIgpaCpLwYCYFI5IDm/7r2XNpYTGAtKmsRO1ahNzoBgt4WoejRZUy9BNml
f+SNKDL/xvIX6V5ZSka1bOrT1w==
MIIEezCCAmOgAwIBAgIUZaC7vTgYBFXsTUWwCiXR8IMANNMwDQYJKoZIhvcNAQEL
BQAwTTELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcMB0Jl
aWppbmcxDTALBgNVBAoMBFRpS1YxCzAJBgNVBAMMAkNBMB4XDTIwMDYwNDA2NDcy
NVoXDTQ3MTAyMTA2NDcyNVowUjELMAkGA1UEBhMCQ04xDjAMBgNVBAgMBUhlbmFu
MRIwEAYDVQQHDAlaaGVuZ3pob3UxDTALBgNVBAoMBFRpS1YxEDAOBgNVBAMMB2Ns
aWVudDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDhGKo6qbSC3uoJ
Tu+Bu8os7ntwXkAXlHWX8abw5IIOBlWaUgW5vfqNgsP8pwTqmOB8MmIHvdZilYcK
XLWj+M2as8dhfEJn02iYceKS72XDJQSa2oiSNKcxl4VUHwxUDFBWAIaJGH3iV+Bb
0n2WWDTOcFUaxxoXTxDTJ4bkFgu/nu1N4OJV4ObAY3Nny5PItvYQexEmrVzsw88j
EPPeKB3dIPl46uIkJxEVme7mFYeagYkptYtD15Fj8kjfjqY3Idz51HRyzulz7vIm
9PGXiERJxnRyuzB13RM7i8M9qtYCKIZWOfcMJNMzLSpR/1e9jDkAYGNPGjcIpzO+
oJLu11mXAgMBAAGjTjBMMDIGA1UdEQQrMCmHBH8AAAGCDnd3dy5nb29nbGUuY29t
ghEqLmV4YW1wbGUubmV0Lm9yZzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIF4DANBgkq
hkiG9w0BAQsFAAOCAgEAp5luo5wCkkcy7hX/G5grujm0wwUSvucsFOcT7njpzI+V
rL0/BeXQRO4zB4Ec+ENBSl2cpFSZHHypmYR7XQ06Vx9lvYUh9pp8172uwfFPIdEc
tTXKZTkDtGo0x1dxFnWCTdt8js5d/lNPbEuGDUOmNMDBYbHLLe7S/p24kEMZZW7a
y1N/A0jC2disAcV2Fp4Qpx3HRv/mP+LHeF9halQP7l1FhJ0QpPN491lXZTzAuoti
DKbafSJaD5wjlFQ/I6apg47yd896NrPk1YpL08ATWtvaZwmkKxh86nTUDSmbRmsL
lUhoy1tlEUpLdLhz8BssO9ERVMjY3H+MqMYzhteQMQq9DdSHbLNNxy55q/FAiepd
QBGE8oR+gLiE4JcD3uJ//1Hb0a2X+qg+iuQ2rKheDA00ZDW3Dv5JbzuZbc9AHlJ7
1B8evE0EGbc34qmM7cCvlTdyNKwsnv5IOEwlHm0P6GRKmLFCcpgC9Dsz3fBxUjpb
zryl0l+2Xfg1SnkpqtXAoNhQkbY3hdRWL2Sy4Iho3xdf5dqmI+bNXLjOeTZHhZof
9Yj7DjpwIrFbhqHVUo3oyCi2a9/c4AApusGTR5XeD0p2tBq7PIO3WEUx2NxBg4MG
8tpcLCIzBsgQUY9bgK1yxhh1OUekvkY5gSwzG02rsOkm6S84PbOqzN+rkbxyP5M=
-----END CERTIFICATE-----
38 changes: 25 additions & 13 deletions tests-and-examples/certs/client1.key
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
Loading