As announced in https://discourse.llvm.org/t/clang-16-notice-of-potentially-breaking-changes/65562, clang 16 defaults `-Wincompatible-function-pointer-types` to be on. This causes a number of hard errors due to implicit conversions between `void *` and `void`, such as:
```
../../../../src/ruby/ext/grpc/rb_channel.c:770:47: error: incompatible function pointer types passing 'VALUE (VALUE)' (aka 'unsigned long (unsigned long)') to parameter of type 'VALUE (*)(void *)' (aka 'unsigned long (*)(void *)') [-Wincompatible-function-pointer-types]
g_channel_polling_thread = rb_thread_create(run_poll_channels_loop, NULL);
^~~~~~~~~~~~~~~~~~~~~~
/root/.rbenv/versions/3.1.4/include/ruby-3.1.0/ruby/internal/intern/thread.h:190:32: note: passing argument to parameter 'f' here
VALUE rb_thread_create(VALUE (*f)(void *g), void *g);
^
../../../../src/ruby/ext/grpc/rb_channel.c:780:41: warning: a function declaration without a prototype is deprecated in all versions of C [-Wstrict-prototypes]
void grpc_rb_channel_polling_thread_stop() {
^
void
../../../../src/ruby/ext/grpc/rb_channel.c:786:30: error: incompatible function pointer types passing 'void (void *)' to parameter of type 'void *(*)(void *)' [-Wincompatible-function-pointer-types]
rb_thread_call_without_gvl(run_poll_channels_loop_unblocking_func, NULL, NULL,
```
This commit fixes these pointer types using wrapper functions where necessary.
This issue was also raised on the FreeBSD port of the grpc gem: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=271540
<!--
If you know who should review your pull request, please assign it to that
person, otherwise the pull request would get assigned randomly.
If your pull request is for a specific language, please add the appropriate
lang label.
-->
Closes #34481
COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/34481 from stanhu:sh-ruby-fix-clang-16
|
||
|---|---|---|
| .. | ||
| bin | ||
| end2end | ||
| ext/grpc | ||
| lib | ||
| nativedebug | ||
| pb | ||
| qps | ||
| spec | ||
| stress | ||
| tools | ||
| .gitignore | ||
| .rubocop.yml | ||
| .rubocop_todo.yml | ||
| CHANGELOG.md | ||
| README.md | ||
README.md
gRPC Ruby
A Ruby implementation of gRPC.
PREREQUISITES
- Ruby 2.x. The gRPC API uses keyword args.
INSTALLATION
Linux and Mac OS X:
gem install grpc
If using a Gemfile and you wish to pull from a git repository or GitHub, make sure to tell bundler to retrieve submodules:
gem 'grpc', github: 'grpc/grpc', submodules: true
BUILD FROM SOURCE
-
Clone this repository
-
Init submodules
git submodule update --init
- Install Ruby 2.x. Consider doing this with RVM, it's a nice way of controlling the exact ruby version that's used.
$ command curl -sSL https://rvm.io/mpapis.asc | gpg --import -
$ \curl -sSL https://get.rvm.io | bash -s stable --ruby=ruby-2
$
$ # follow the instructions to ensure that your're using the latest stable version of Ruby
$ # and that the rvm command is installed
-
Make sure your run
source $HOME/.rvm/scripts/rvmas instructed to complete the set up of RVM -
Install bundler
$ gem install bundler
- Finally, build and install the gRPC gem locally.
$ # from this directory
$ bundle install # creates the ruby bundle, including building the grpc extension
$ rake # runs the unit tests, see rake -T for other options
DOCUMENTATION
- rubydoc for the gRPC gem is available online at rubydoc.
- the gRPC Ruby reference documentation is available online at grpc.io
CONTENTS
Directory structure is the layout for ruby extensions
-
ext: the gRPC ruby extension
-
lib: the entrypoint gRPC ruby library to be used in a 'require' statement
-
spec: Rspec unittests
-
bin: example gRPC clients and servers, e.g,
stub = Math::Math::Stub.new('my.test.math.server.com:8080', :this_channel_is_insecure) req = Math::DivArgs.new(dividend: 7, divisor: 3) GRPC.logger.info("div(7/3): req=#{req.inspect}") resp = stub.div(req) GRPC.logger.info("Answer: #{resp.inspect}")