続 mod_mrubyでmrubyのビルドサーバを書いた
この記事で、mod_mrubyで数行書くとmrubyのビルドサーバが書けるということをやっていたのですが、@matsumotoryさんが以下のようなコメントをされていたので、対応をしました。
libmruby.flags.makのような情報も返せるとさらによいなぁ / すごい!便利!! / “mod_mrubyでmrubyのビルドサーバを書いた - ujunのブログ” http://t.co/M8kNFQW86t
— MATSUMOTO, Ryosuke (@matsumotory) 2015, 9月 16
@matsumotory 有難うございます!取急ぎレスポンスヘッダに該ファイルの内容を積むようにしたのですが、他に方法が思付きませんでした。。https://t.co/IiKZSwC9lq RT @matsumotory: libmruby.flags.makのような情報も
— Jun Uchino (@u3jun) 2015, 9月 21
libmruby.flags.makはmrubyビルド時にlibmruby.aと同パスに生成されますが、以下のようなフォーマットになっていて、libmruby.aをスタティックリンクする際にこのファイルからオプションを得るみたいな用途で必要になります(参考:人間とウェブの未来 - マルチプラットフォームでmrubyを使ってHTTP通信する方法)。
MRUBY_CFLAGS = -g -std=gnu99 -O3 -Wall -Werror-implicit-function-declaration -Wdeclaration-after-statement -Wwrite-strings -I\"/path/to/mruby/include\" MRUBY_LDFLAGS = -L/path/to/mruby/lib MRUBY_LDFLAGS_BEFORE_LIBS = MRUBY_LIBS = -lmruby -lm -lreadline -lncurses
この情報をサーバから返すにはどうしたらいいか。。。
現状、libmruby.aをレスポンスボディで返しているので、さらにボディに追加するのは難しいってことで、 無理やりレスポンスヘッダに設定することで乗り切ることにしました!!
生成されたlibmruby.flags.makを読み込み、(左辺)=(右辺)のような形でマッチした部分をキャプチャし、 (key, value) = (左辺, 右辺) としてレスポンスヘッダに突っ込んでいます。
@@ -8,6 +8,16 @@ # build mruby `cd /var/www/html/mruby; rake` +# set values in libmruby.flags.mak to response headers +File.open("/var/www/html/mruby/build/host/lib/libmruby.flags.mak") do |file| + reg = Regexp.compile("([^=]+)\s=(.*)\n") + file.each do |line| + if reg =~ line + r.headers_out[$1] = $2 + end + end +end + # return the generated static library r.filename = "/var/www/html/mruby/build/host/lib/libmruby.a"
ということで、このサーバに対してcurlすると、レスポンスヘッダの中に欲しい情報が入るようになりました。 (以下の、MRUBY_CFLAGS, MRUBY_LDFLAGS, MRUBY_LDFLAGS_BEFORE_LIBS, MRUBY_LIBS)
$ curl -v -d "`cat /path/to/build_confg.rb`" -o libmruby.a http://hostname:8080/mruby-build ・・・ > POST /mruby-build HTTP/1.1 > User-Agent: curl/7.37.1 > Host: hostname:8080 > Accept: */* > Content-Length: 848 > Content-Type: application/x-www-form-urlencoded > } [data not shown] * upload completely sent off: 848 out of 848 bytes 100 848 0 0 100 848 0 13 0:01:05 0:01:04 0:00:01 0< HTTP/1.1 200 OK < Date: Mon, 21 Sep 2015 13:04:40 GMT * Server Apache/2.4.7 (Ubuntu) is not blacklisted < Server: Apache/2.4.7 (Ubuntu) < MRUBY_CFLAGS: -g -std=gnu99 -O3 -Wall -Werror-implicit-function-declaration -Wdeclaration-after-statement -Wwrite-strings -I\"/var/www/html/mruby/include\" < MRUBY_LDFLAGS: -L/var/www/html/mruby/build/host/lib < MRUBY_LDFLAGS_BEFORE_LIBS: < MRUBY_LIBS: -lmruby -lm -lcrypto < Last-Modified: Mon, 21 Sep 2015 13:05:44 GMT < ETag: W/"6fbc80-520418a0948d2" < Accept-Ranges: bytes < Content-Length: 7322752 < ・・・
@matsumotoryさん有難うございます!!