際際滷

際際滷Share a Scribd company logo
GNU make 4.0に
採かいる
@emasaka
GNU make 4.0鞠
¢

10/8リリ`ス

¢

麼な仟C嬬
C

--output-syncK双g佩で竃薦が詞ざるのを契ぐ

C

--traceg佩するコマンドを竃薦

C

GuileをMみzめる
Guile
¢

GNUのSchemeインタ`プリタ

¢

アプリMみzみが麼な朕議
C

TclとかLuaとかmrubyとかと揖
ブログにも慕いた
やってみる1
¢

Guileをインスト`ルしておく
C

¢

$ sudo apt-get install guile-2.0 guile-2.0-devs

仝guile-2.0々パッケ`ジはなくてもいいと房うけ
ど、Schemeコ`ドの嘛_Jのため
やってみる2
¢

GNU make 4.0のソ`スをもってきて婢_

¢

./configure
C

このときにGuile┘薀ぅ屮薀蝪が秘っていると、makeの
Guileサポ`トが嗤燭砲覆
¢

C

おそらくLinuxディストロではo燭砲覆襪里任錬

--with-guile=noで苧幣議にo燭
やってみる3
¢
¢

$ make
$ ldd ./make | grep guile
libguile-2.0.so.22 => /usr/lib/libguile-2.0.so.22
(0x00007f6482291000)
_J
¢

.FEATURES篳に^guile ̄が秘っていればOK

$?cat?features.mk
all:
????????@echo?$(.FEATURES)
$?./make??f?features.mk
target?specific?order?only?second?expansion?else?if?
shortest?stem?undefine?oneshell?archives?jobserver?
output?sync?check?symlink?guile?load
聞いかた
¢

$(guile ?)v方

¢

ようは$(shell ?)v方でシェルを柵ぶのといっしょ
箭1困箸蠅△┐些薦
all:
echo?$(guile?'("Hello,?World!"))
箭2困覆鵑Schemeっぽいの
sexp?=?(map?(lambda?(x)?(+?x?3))?(iota?10))
all:
@echo?$(guile?$(sexp))
箭3FizzBuzzshell井
http://d.hatena.ne.jp/eel3/20110924/1316791928 より

all:?$(shell?seq?1?1?100)
$(shell?seq?3?3?100):
@echo?Fizz
$(shell?seq?5?5?100):
@echo?Buzz
$(shell?seq?15?15?100):
@echo?FizzBuzz
.DEFAULT:
@echo?$@
箭3FizzBuzzguile井
all:?$(guile?(use?modules?(srfi?srfi?1)))?$
(guile?(iota?100?1?1))
$(guile?(iota?100?3?3)):
@echo?Fizz
$(guile?(iota?100?5?5)):
@echo?Buzz
$(guile?(iota?100?15?15)):
@echo?FizzBuzz
.DEFAULT:
@echo?$@
箭3FizzBuzzg佩rg
$?time?./make??f?fb?scm.mk?>&?/dev/null
./make??f?fb?scm.mk?>&/dev/null??0.10s?user?
0.06s?system?47%?cpu?0.337?total
$?time?./make??f?fb?sh.mk?>&?/dev/null
./make??f?fb?sh.mk?>&/dev/null??0.05s?user?
0.04s?system?35%?cpu?0.258?total

shell井のほうが堀い
箭4SchemeでmakeのDSL
define?dsl
(use?modules?(srfi?srfi?1))
(define?targets?'())
(define?(showtargets)
??(string?join?(reverse?targets)?"n")?)
(define?macro?(push!?place?item)
??`(set!?,place?(cons?,item?,place))?)
(define?(mklist?>str?lst)
??(string?join?(map?symbol?>string?lst))?)
(define?macro?(deftarget?tgt?dep?.?cmds)
??(push!?targets
?(format?#f?"~a:~a~a"
?tgt?(mklist?>str?dep)
?(fold?(lambda?(x?r)
?(string?append?r?"nt"?(mklist?>str?x)))?""?cmds?))?))
(deftarget?all?(foo)
??(@./foo))
(deftarget?foo?(foo.c)
??(cc?foo.c??o?foo)?)
endef
dummy?:=?$(guile?$(dsl))
$(guile?(gmk?eval?(showtargets)))

More Related Content

GNU make 4.0に採かいる