Rubyの標準添付ライブラリにmkmf
があります。
これは本来Rubyの拡張ライブラリを作るMakefileを作るためのRuby標準添付ライブラリなのですが、Ruby developerの方々の手によって素晴らしく便利で柔軟に作られているため、かんたんにマシンの環境チェックする用途にも使えるようです。
「構造体struct statでst_ctim.tv_nsecメンバーが取れる環境なのかチェックしたい」
=> have_struct_member("struct stat", "st_ctim.tv_nsec")
「mecabが使えるものなら使いたい」
=> have_header('mecab.h')
「ライブラリlibcがあってしかもprintfが使えるのか気になってしょうがない」
=> have_library("c", "printf")
「今までチェックしたことをまとめてヘッダーファイルとして書き出したい」
=> create_header
このヘッダーファイルにはstruct stat st_ctim.tv_nsec
メンバーがあるなら#define HAVE_STRUCT_STAT_ST_CTIM 1
のように書きだされています。
あとはヘッダーファイルを#include
して#ifdef
等で分岐すればどんな環境でもポータブルに使えるコードを書くことができます。(要調査力)
わざわざヘッダーに書きださなくても$defsには["-DHAVE_STRUCT_STAT_ST_CTIM"]
のように配列が詰まっているのでコンパイルオプションとしても使いやすく設計されています。
使い方はかんたん。require 'mkmf'
と唱えるだけです。
Rubyのコードなのでif文なんかも思いのまま、これでご家庭の隅に複雑に詰まってしまったconfigureのいくつかはRubyコードで綺麗にまとめられるんじゃないでしょうか。
「こっちのほうがもっと汎用的で高機能だよー」等の声があればぜひ教えていただきたいところですが、「標準添付」は結構なアドバンテージなのではないでしょうか。Rubyすばらしい。
(「mkmfをそんな用途に使うんじゃねえ!」って言われたらどうしよう。。。)