ujunのブログ

続 mod_mrubyでmrubyのビルドサーバを書いた

この記事で、mod_mrubyで数行書くとmrubyのビルドサーバが書けるということをやっていたのですが、@matsumotoryさんが以下のようなコメントをされていたので、対応をしました。

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さん有難うございます!!