GNU make 4.0に
何かいる
@emasaka
GNU make 4.0登場
●

10/8リリース

●

主な新機能
–

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

–

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

–

Guileを組み込める
Guile?
●

GNUのSchemeインタープリタ

●

アプリ組み込みが主な目的
–

TclとかLuaとかmrubyとかと同類
ブログにも書いた
やってみる1
●

Guileをインストールしておく
–

●

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

「guile-2.0」パッケージはなくてもいいと思うけ
ど、Schemeコードの...
やってみる2
●

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

●

./configure
–

このときにGuile(ライブラリ)が入っていると、makeの
Guileサポートが有効になる
●

–

おそらくLinuxディストロで...
やってみる3
●
●

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

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

$ cat features.mk
all:
        @echo $(.FEATURES)
$ ./make ­f features.mk
target­speci...
使いかた
●

$(guile 〜)関数

●

ようは$(shell 〜)関数でシェルを呼ぶのといっしょ
例1:とりあえず出力
all:
echo $(guile '("Hello, World!"))
例2:なんかSchemeっぽいの
sexp = (map (lambda (x) (+ x 3)) (iota 10))
all:
@echo $(guile $(sexp))
例3:FizzBuzz(shell版)
http://d.hatena.ne.jp/eel3/20110924/1316791928 より

all: $(shell seq 1 1 100)
$(shell seq 3 3 100):
@ec...
例3:FizzBuzz(guile版)
all: $(guile (use­modules (srfi srfi­1))) $
(guile (iota 100 1 1))
$(guile (iota 100 3 3)):
@echo Fizz...
例3:FizzBuzz(実行時間)
$ time ./make ­f fb­scm.mk >& /dev/null
./make ­f fb­scm.mk >&/dev/null  0.10s user 
0.06s system 47% cp...
例4:SchemeでmakeのDSL
define dsl
(use­modules (srfi srfi­1))
(define targets '())
(define (showtargets)
  (string­join (rever...
Upcoming SlideShare
Loading in …5
×

GNU make 4.0に何かいる

1,350 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,350
On SlideShare
0
From Embeds
0
Number of Embeds
403
Actions
Shares
0
Downloads
1
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

GNU make 4.0に何かいる

  1. 1. GNU make 4.0に 何かいる @emasaka
  2. 2. GNU make 4.0登場 ● 10/8リリース ● 主な新機能 – --output-sync:並列実行で出力が混ざるのを防ぐ – --trace:実行するコマンドを出力 – Guileを組み込める
  3. 3. Guile? ● GNUのSchemeインタープリタ ● アプリ組み込みが主な目的 – TclとかLuaとかmrubyとかと同類
  4. 4. ブログにも書いた
  5. 5. やってみる1 ● Guileをインストールしておく – ● $ sudo apt-get install guile-2.0 guile-2.0-devs 「guile-2.0」パッケージはなくてもいいと思うけ ど、Schemeコードの動作確認のため
  6. 6. やってみる2 ● GNU make 4.0のソースをもってきて展開 ● ./configure – このときにGuile(ライブラリ)が入っていると、makeの Guileサポートが有効になる ● – おそらくLinuxディストロでは無効になるのでは? --with-guile=noで明示的に無効に
  7. 7. やってみる3 ● ● $ make $ ldd ./make | grep guile libguile-2.0.so.22 => /usr/lib/libguile-2.0.so.22 (0x00007f6482291000)
  8. 8. 確認 ● .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
  9. 9. 使いかた ● $(guile 〜)関数 ● ようは$(shell 〜)関数でシェルを呼ぶのといっしょ
  10. 10. 例1:とりあえず出力 all: echo $(guile '("Hello, World!"))
  11. 11. 例2:なんかSchemeっぽいの sexp = (map (lambda (x) (+ x 3)) (iota 10)) all: @echo $(guile $(sexp))
  12. 12. 例3:FizzBuzz(shell版) 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 $@
  13. 13. 例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 $@
  14. 14. 例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版のほうが速い!
  15. 15. 例4:Schemeで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)))

×