* 4 関数
- この読書メモ、見出しは本'GNU make'に準拠してい
るが、内容は本そのままではない。
- 本以外にinfoも読んでいる。
- 本とinfoを読んでの自分なりのまとめ。
特にこの節は、Acrobat Readerのプロセスを終了する
例が好みじゃない。
- ということで、まずinfoを中心に関数の基礎を整理す
る。
** 8 Functions for Transforming Text [make.info]
*** 8.1 Function Call Syntax
- 形式
- 変数の似ている
$(FUNCTION ARGUMENTS)
${FUNCTION ARGUMENTS}
- 例1
$(subst ee,EE,feet on the street)
# feet on the street -> fEEt on the strEEt
- 例2 関数の引数に関数をつかう
$(subst ee,EE,$(subst t,T,feet on the street))
# feet on the street -> feeT on The sTreeT -> fEET on The sTrEET
- 例3 関数の引数に変数をつかう
before := ee
after := EE
$(subst $(before),$(after),feet on the street)
# feet on the street -> fEEt on the strEEt
*** 8.2 Functions for String Substitution and Analysis
- 組み込み関数のうち、文字列関係のもの。
- subst
- 形式
$(subst FROM,TO,TEXT)
- 例
上記とおり。
- patsubst
- 形式
$(patsubst PATTERN,REPLACEMENT,TEXT)
- 例
objects = foo.o bar.o baz.o
$(patsubst %.o,%.c,$(objects))
# => foo.c bar.c baz.c
- 例 Substitution referenceという代替手段もある。
objects = foo.o bar.o baz.o
$(objects:.o=.c)
# => foo.c bar.c baz.c
- strip
- 形式
$(strip STRING)
- 例
$(strip " a b c ")
# => " a b c "
$(strip a b c )
# => a b c[行末]
- findstring
- 形式
$(findstring FIND,IN)
- 例
$(findstring a,a b c)
# => a
$(findstring a,b c)
# => [行末]
- filter
- 形式
$(filter PATTERN...,TEXT)
- 例
sources := foo.c bar.c baz.s ugh.h
$(filter %.c %.s,$(sources))
# => foo.c bar.c baz.s
- filter-out
- 形式
$(filter-out PATTERN...,TEXT)
- 例
sources := foo.c bar.c baz.s ugh.h
$(filter-out %.c %.s,$(sources))
# => ugh.h
- sort
- 形式
$(sort LIST)
- 例
$(sort foo bar lose)
# bar foo lose
- word
- 形式
$(word N,TEXT)
- 例
$(word 2, foo bar baz)
# => bar
- wordlist
- 形式
$(wordlist S,E,TEXT)
- 例
$(wordlist 2, 3, foo bar baz)
# => bar baz
- words
- 形式
$(words TEXT)
- 例
$(words foo bar baz)
# => 3
- firstword
- 形式
$(firstword NAMES...)
- 例
$(firstword foo bar)
# => foo
- lastword
- 形式
$(lastword NAMES...)
- 例
$(firstword foo bar)
# => bar
*** 8.3 Functions for File Names
- dir
- 形式
$(dir NAMES...)
- 例
$(dir src/foo.c hacks)
# => src/ ./
- notdir
- 形式
$(notdir NAMES...)
- 例
$(notdir src/foo.c hacks)
# => foo.c hacs
- suffix
- 形式
$(suffix NAMES...)
- 例
$(suffix src/foo.c src-1.0/bar.c hacks)
# => .c .c
- basename
- 形式
$(basename NAMES...)
- 例
$(basename src/foo.c src-1.0/bar.c hacks)
# => src/foo src-1.0/bar hacks
- addsuffix
- 形式
$(addsuffix SUFFIX,NAMES...)
- 例
$(addsuffix .c,foo bar)
# => foo.c bar.c
- addprefix
- 形式
$(addprefix PREFIX,NAMES...)
- 例
$(addprefix src/,foo bar)
# => src/foo src/bar
- join
- 形式
$(join LIST1,LIST2)
- 例
$(join a b,.c .o)
# => a.c b.o
- wildcard
- 形式
$(wildcard PATTERN)
- 例
# touch foo.c foo.o bar.c baz.h ugh.o
# がmakeの第一段階前に為されていることが前提
$(wildcard %.o)
# => foo.o ugh.o
- realpath
- 形式
$(realpath NAMES...)
- 例
$(realpath ./ ../)
# /home/aka/local/work/scratch/make /home/aka/local/work/scratch
- abspath
- 形式
$(abspath NAMES...)
- 例
$(realpath ./ ../)
# /home/aka/local/work/scratch/make /home/aka/local/work/scratch
- realpathとabspathの差異
- abspathはfileが存在するかどうかは関知しない。
realpathは、存在しなければエラー。
- abspathはsymlinkを追わない。realpathは追う。
*** 8.4 Functions for Conditionals
- if
- 形式
$(if CONDITION,THEN-PART[,ELSE-PART])
- 例
$(if "", T, NIL)
# => T
$(if , T, NIL)
# => NIL
$(if "hoge", T, NIL)
# => T
$(if hoge, T, NIL)
# => T
- or
- 形式
$(or CONDITION1[,CONDITION2[,CONDITION3...]])
- 例
$(or first, second, third)
# => first
$(or , second, third)
# => second
$(or , , third)
# => third
- and
- 形式
$(and CONDITION1[,CONDITION2[,CONDITION3...]])
- 例
$(and first, second, third)
# => third
$(and , second, third)
# => [行末]
$(and , , third)
# => [行末]
*** 8.5 The 'foreach' Function
- foreach
- 形式
$(foreach VAR,LIST,TEXT)
- 例
dirs := a b c d
files := $(foreach dir,$(dirs),$(wildcard $(dir)/*))
# ディレクトリa b c dに含まれているファイルの
# リストをfilesに格納。
*** 8.6 The 'call' Function
- call
- 形式
$(call VARIABLE,PARAM,PARAM,...)
- 例
reverse = $(2) $(1)
$(call reverse,a,b)
# b a
- 補足
$(N)をつかった変数やマクロをcallのパラメータ
で展開する。
*** 8.7 The 'value' Function
- value
- 形式
$(value VARIABLE)
- 例
FOO = $PATH
value:
@echo $(FOO)
@echo $(value FOO)
# => ATH
# => /usr/bin:/usr/local/bin:...
- 補足
値の展開前状態を得る。
*** 8.8 The 'eval' Function
- eval
- 形式
$(eval PARAM)
- 例
define PROC
UNDEFINED += hoge
endef
eval:
# $(UNDEFINED)
# $(eval $(call PROC))
# $(UNDEFINED)
# 最後のUNDIFINEDはhogeになる。
- 補足
引数を展開した上で、それをmakefileの一部であ
るがごとく取り扱う。
*** 8.9 The 'origin' Function
- origine
- 形式
$(origin VARIABLE)
- 例
$(origin LANG)
# => environment
*** 8.10 The 'flavor' Function
- flavor
- 形式
$(flavor VARIABLE)
- 例
SIM := hoge
REC = hoge
$(flavor SIM)
# => simple
$(flavor REC)
# => recursive
*** 8.11 The 'shell' Function
- shell
- 形式
$(shell COMMAND[ ARGS ...])
- 例
shell:
# $(shell date)
# $(shell sleep 5)
# $(shell date)
# 結果
# 2009年 11月 14日 土曜日 00:06:46 JST
#
# 2009年 11月 14日 土曜日 00:06:51 JST
*** 8.12 Functions That Control Make
- error
- 形式
$(error TEXT...)
- 例
$(error found an error!)
# => found an error!
- 補足
makeはexitする。
- warning
- 形式
$(warning TEXT...)
- 例
$(warning found an error)
# => found an error
- 補足
makeはexitしない。
- info
- 形式
$(info TEXT...)
- 例
$(info info printed)
# 標準出力に"info printed"を出力
うひー。こつこつ。
0 件のコメント:
コメントを投稿