読者です 読者をやめる 読者になる 読者になる

non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

qrintfをclangで使ったらautoconfの事が少し分かった件

おはようございます。奥さんが先々週の海外出張に引き続き、国内出張で不在の為、またまた実家生活してます。迎え火を次男は初で抱っこで渡り、長男は多分2回目で単独では初めて渡り、お坊さんを迎え、お経を聞いたりと自宅では体験できないイベントを経験しています。kjunichiです。

 

背景

osxでlibtrusterdをrustで動かせたので、xhyveでboot2docker-xhyveを動かしLinuxでも動作確認しようとした際にハマった。

qrintf-gccがない

qrintfがclangに対応したのを以前から知っていたが、この対応時にコマンドラインインタフェースが変更となっていた。Travis ciでlibtrusterdもLinuxでビルドしているが、clangを明示的に指定していたので、qrintfが使われておらず、長いこと、qrintf-gccがなくなっていることに気が付かずにいた。

mruby-onig-regexpでエラー

せっかくqrintfがclangに対応したのだからということで、CC=qrintf clangでビルドを始めたら、mruby-onig-regexpでエラーコンパイラのC89対応の判定で未対応と誤判定され、clangやその他のモダンコンパイラではビルドしてくれない、varargs.hを使ったコードをビルドしようとして、エラーとなっていた。

分かったこと

./configureで使われているC89に対応するためのオプションを調べる際にac_fn_c_try_compile内で、CCに指定されたコンパイラ(今回はqrintf clang)を使って、予め用意されている引数をテストしていくのだが、この際、コンパイラの終了コードの他に生成したオブジェクトコードや標準エラー出力もチェックしており、今回qrintf clangでは、-o指定が無い限り、一時ファイルが任意のファイル名が振られてしまい、これが原因でどの引数でコンパイルしてもエラーとなりC89サポートをしていないと判定されていた。

Link

 

 

https://github.com/kjunichi/qrintf