15
GNU make 4.0何かいる @emasaka

GNU make 4.0に何かいる

  • Upload
    emasaka

  • View
    764

  • Download
    1

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: GNU make 4.0に何かいる

GNU make 4.0に何かいる

@emasaka

Page 2: GNU make 4.0に何かいる

GNU make 4.0登場

● 10/8リリース● 主な新機能

– --output-sync:並列実行で出力が混ざるのを防ぐ

– --trace:実行するコマンドを出力

– Guileを組み込める

Page 3: GNU make 4.0に何かいる

Guile?

● GNUのSchemeインタープリタ● アプリ組み込みが主な目的

– TclとかLuaとかmrubyとかと同類

Page 4: GNU make 4.0に何かいる

ブログにも書いた

Page 5: GNU make 4.0に何かいる

やってみる1

● Guileをインストールしておく– $ sudo apt-get install guile-2.0 guile-2.0-devs

● 「guile-2.0」パッケージはなくてもいいと思うけど、Schemeコードの動作確認のため

Page 6: GNU make 4.0に何かいる

やってみる2

● GNU make 4.0のソースをもってきて展開

● ./configure– このときにGuile(ライブラリ)が入っていると、makeの

Guileサポートが有効になる● おそらくLinuxディストロでは無効になるのでは?

– --with-guile=noで明示的に無効に

Page 7: GNU make 4.0に何かいる

やってみる3

● $ make● $ ldd ./make | grep guile

libguile-2.0.so.22 => /usr/lib/libguile-2.0.so.22 (0x00007f6482291000)

Page 8: GNU make 4.0に何かいる

確認

● .FEATURES変数に“guile”が入っていればOK

$ cat features.mkall:        @echo $(.FEATURES)$ ./make ­f features.mktarget­specific order­only second­expansion else­if shortest­stem undefine oneshell archives jobserver output­sync check­symlink guile load

Page 9: GNU make 4.0に何かいる

使いかた

● $(guile 〜)関数

● ようは$(shell 〜)関数でシェルを呼ぶのといっしょ

Page 10: GNU make 4.0に何かいる

例1:とりあえず出力

all:echo $(guile '("Hello, World!"))

Page 11: GNU make 4.0に何かいる

例2:なんかSchemeっぽいの

sexp = (map (lambda (x) (+ x 3)) (iota 10))

all:@echo $(guile $(sexp))

Page 12: GNU make 4.0に何かいる

例3:FizzBuzz(shell版)

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 $@

http://d.hatena.ne.jp/eel3/20110924/1316791928 より

Page 13: GNU make 4.0に何かいる

例3:FizzBuzz(guile版)

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 $@

Page 14: GNU make 4.0に何かいる

例3:FizzBuzz(実行時間)

$ 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版のほうが速い!

Page 15: GNU make 4.0に何かいる

例4:SchemeでmakeのDSLdefine 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 "\n\t" (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)))