client-rust icon indicating copy to clipboard operation
client-rust copied to clipboard

Building tikv-client for Windows (x86_64-pc-windows-gnu)

Open tobiemh opened this issue 2 years ago • 5 comments

Hi,

I'm trying to build a library (which uses tikv-client as a dependency). I've attempted to compile this library on Windows (in Github Actions), Ubuntu (in Github Actions), and macOS (locally), none of which are working.

The issue that I have is that grpc-sys is unable to build successfully.

On Windows I have tried with the default environment (which includes all of the necessary packages), and I have also installed the following packages just in case:

pacman --noconfirm -S mingw-w64-x86_64-yasm mingw-w64-clang-x86_64-clang mingw-w64-x86_64-binutils mingw-w64-x86_64-openssl

On Ubuntu I have installed:

sudo apt-get -y install mingw-w64

And on macOS I have installed:

brew install clang mingw-w64

In Github Actions, the tooling versions I am using are:

go version go1.17.12 windows/amd64
cargo 1.62.1 (a748cf5a3 2022-06-08)
rustc 1.62.1 (e092d0b6b 2022-07-16)
cmake version 3.23.3
gcc.exe (MinGW-W64 x86_64-posix-seh, built by Brecht Sanders) 11.2.0
g++.exe (MinGW-W64 x86_64-posix-seh, built by Brecht Sanders) 11.2.0
perl v5.32.1 built for x86_64-msys-thread-multi

There are two issues that I am encountering:

1. First issue

The build fails with:

C:/Users/runneradmin/.cargo/registry/src/github.com-1ecc6299db9ec823/grpcio-sys-0.8.1/grpc/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc:451:26: error: 'numeric_limits' is not a member of 'std'
...
C:/Users/runneradmin/.cargo/registry/src/github.com-1ecc6299db9ec823/grpcio-sys-0.8.1/grpc/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc:451:49: error: expected primary-expression before '>' token
...
C:/Users/runneradmin/.cargo/registry/src/github.com-1ecc6299db9ec823/grpcio-sys-0.8.1/grpc/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc:451:52: error: '::max' has not been declared; did you mean 'std::max'?

This error can be solved by editing the grpcio-sys-0.8.1/grpc/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc and adding #include <limits> towards the top. Currently tikv-client relies on [email protected] which relies on [email protected]. This issue has been fixed in the later versions of grpcio and grpcio-sys.

Is there a possibility of upgrading the grpcio dependency in tikv-client?

2. Second issue

Once this issue is solved, we hit another issue. The build fails with:

././grpc/include/grpc/impl/codegen/port_platform.h:54:10: fatal error: 'windows.h' file not found
././grpc/include/grpc/impl/codegen/port_platform.h:54:10: fatal error: 'windows.h' file not found, err: true
  thread 'main' panicked at 'Unable to generate grpc bindings: ()', /Users/tobie/.cargo/registry/src/github.com-1ecc6299db9ec823/grpcio-sys-0.8.1/build.rs:370:10

I am not too sure how to get around this issue. I have set the following in my .cargo/config.toml file, but it does not change the outcome:

[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
ar = "x86_64-w64-mingw32-gcc-ar"

Does anyone know a way of getting tikv-client and/or grpcio to build for x86_64-pc-windows-gnu?

tobiemh avatar Aug 10 '22 20:08 tobiemh

Thanks for the feedback. grpcio has been updated to 0.10 in master. Could you try that? Does the second problem happen only on Windows?

ekexium avatar Aug 11 '22 04:08 ekexium

Hi @ekexium yes I saw this just after I posted the issue! I'm currently building off the master version, and it takes a lot longer (so I'm presuming that the C build works this time), but I get now this error:

error: couldn't read /Users/tobie/Repositories/surrealdb/target/x86_64-pc-windows-gnu/release/build/grpcio-sys-89eb569412f5ce5d/out/grpc-bindings.rs: No such file or directory (os error 2)
 --> /Users/tobie/.cargo/registry/src/github.com-1ecc6299db9ec823/grpcio-sys-0.10.3+1.44.0-patched/src/lib.rs:8:5
  |
8 |     include!(env!("BINDING_PATH"));
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: this error originates in the macro `include` (in Nightly builds, run with -Z macro-backtrace for more info)

error: could not compile `grpcio-sys` due to previous error
make: *** [build] Error 101

This is when cross-compiling from macOS (macos on aarch64) to Windows (x86_64-pc-windows-gnu).

I'll go and test this in Ubuntu (Github Actions) now.

tobiemh avatar Aug 11 '22 07:08 tobiemh

I tried a bit on my own linux. Seems to me cross compiling grpcio is difficult. There is a doc (it may be outdated) https://github.com/tikv/grpc-rs/blob/master/cross_compile.md

Maybe just try if it builds on Windows? If not, I suggest asking in tikv/grpc-rs.

ekexium avatar Aug 11 '22 09:08 ekexium

Hi @ekexium yeah I've looked at that doc - it's very outdated!

tobiemh avatar Aug 11 '22 10:08 tobiemh

Have created an issue for this problem in the tikv/grpc-rs repository: https://github.com/tikv/grpc-rs/issues/585

tobiemh avatar Aug 11 '22 12:08 tobiemh

should be fixed by https://github.com/tikv/client-rust/pull/399

andylokandy avatar Jul 10 '23 04:07 andylokandy