🤫

pecl install grpcで大量のwarningメッセージ出た時の対処法

2024/12/04に公開

多すぎるwarningメッセージは非常に厄介

pecl install grpcをすると大量のWarningメッセージが出ます。

#7 67.72 /tmp/pear/temp/grpc/src/core/lib/promise/detail/promise_factory.h:174:5: warning: 'always_inline' function might not be inlinable [-Wattributes]

#7 352.5 /tmp/pear/temp/grpc/src/core/lib/event_engine/forkable.h:61:34: warning: 'unused' attribute ignored [-Wattributes]

上記のようなメッセージが軽く数百件以上出てきます。
その影響で、Deploy時にCI/CDのログ上限を天元突破して、エラー吐いて落ちるという現象に悩まされていました。

原因

warningメッセージの内容で検索をかけると「GCC, the GNU Compiler Collection」がヒットします。

どうやら、これらのWarningはgRPCのソースコードをコンパイルしているコンパイラから発生していそうです。なので、grpc利用者側が直接ソースコードを修正して、warning自体を根本から抑制することは難しい(はず)です。

修正方針

GNUコンパイラには、warningメッセージ発生を抑制するためのオプションが複数あるので、それを渡してやれば良さそう。

https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

しかし、pecl install grpcには直接渡せそうにないので、別の方法で渡す必要があります。
(もしpecl installで渡せる方法あれば教えてください。泣いて喜びます🥹)

どうしよう....

以下のStackOverflowから天啓を得ました。
pecl installが実行してくれている部分を分割して、コンパイルが走る箇所にオプションを渡してやれば良さそうです。

https://stackoverflow.com/a/47120441

また、gRPCはc++で書かれているので、CFLAGSCXXFLAGSの環境変数にwarning抑制オプションを渡して、コンパイル時に指定してやれば抑制できそうです。

https://wiki.gentoo.org/wiki/GCC_optimization/ja

修正内容

Dockerfile内でgRPCをインストールするものと仮定します。

before

RUN pecl install grpc

after

RUN pecl download grpc \
  && tar xzf $(ls grpc-*.tgz | head -n 1) \
  && cd $(ls -d grpc-*/ | head -n 1) \
  && phpize \
  && ./configure --with-php-config=/usr/local/bin/php-config \
  && make -e CFLAGS="-Wno-attributes -Wno-unused-parameter -Wno-deprecated-declarations -Wno-return-type" CXXFLAGS="-Wno-attributes -Wno-unused-parameter -Wno-deprecated-declarations -Wno-return-type" \
  && make install

afterのコマンドは、ほとんどpecl installが内部的に実行している処理と同じです。
中身を分割してみると、pecl installは色々やってくれてたんだなと感動しました。

コンパイル時のwarningメッセージが出ていたのは、makeの部分だったのでここに環境変数(CFLAGS, CXXFLAGS)を渡しました。

make -e CFLAGS="-Wno-attributes -Wno-unused-parameter -Wno-deprecated-declarations -Wno-return-type" CXXFLAGS="-Wno-attributes -Wno-unused-parameter -Wno-deprecated-declarations -Wno-return-type"

ちなみに、CFLAGSCXXFLAGSに渡す抑制オプションはどこを見ればわかるかというと、warningメッセージの最後 を見ればOKです。
[-Wattributes][-Wunused-parameter]という表記があると思います。
これらの-Wの後にnoをつけて[-Wno-attributes][-Wno-unused-parameter]としてやればOKです。

その他オプションについては以下の記事をご覧ください。

https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

最後に

この対応のおかげで、Warningメッセージ沼からは無事逃げ出すことができました。
しかし、まだCI/CDのログ上限問題は完全に解決という訳にはいきませんでした。
また後日完全解決した方法を別記事にて投稿できればと思います。

この記事を読むことで、一人でも多くの方をgRPCのwarningメッセージ沼から救い出すことができれば嬉しいです🙌

Studio Tech Blog

Discussion