Makefileに関するあれこれ(1/2)

makeが好き。
プログラミングの時はもとより動画のエンコードするのにもおもわずMakefileかいちゃうぐらいmakeが好き。
まぁ、それ以上にvimが好きなんだけどね。

ということでMakefileのあれこれ。
メモ書き〜〆(д)

とりあえずメモ代わりに、コンマ,空白の扱い

comma:= ,
empty:=
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(empty),$(foo))
# bar == "a,b,c"

info Makefile
に書いてあることそのまんまなんだけどね

具体例とか。

とりあえず授業とか1ファイル1バイナリなものをテキトーにmakeするMakefile

SRCS=$(wildcard *.c)
BINS=$(patsubst %.c,%,$(SRCS))

all: $(BINS)

これだけ。
あとは暗黙のルールだけでおっけー。

場合に応じて

LDFLAGS=-lm

とか加えてやればなおよし。


前まで$(subst .c,,$(SRCS))使ってたんだけど$(patsubst %.c,%,%(SRCS))の方がよさげ。
substだと"hoge.custom.c"が"hogeustom"になっちゃう。
patsubstを使うべし。


あとpatsubstは

BINS=$(SRCS:.c=)

でもおっけー。


下の二つは同じ意味になるらしい。

$(patsubst %AAA,%BBB,$(VAR))
$(VAR:AAA=BBB)

普段使うとしたら

OBJS=$(patsubst %.c,%.o,$(SRCS))
OBJS=$(SRCS:.c=.o)

あたり?


一番一般的なMakefile

SRCS=hoge.c fuga-function.c
OBJS=$(SRCS:.c=.o)
TARGET=hoge

.PHONY: all clean
all: $(TARGET)

$(TARGET): $(OBJS)
	$(CC) $(CLFAGS) $(LDFLAGS) -o $@ $^

%.o: %.c
	$(CC) $(CFLAGS) -c $<

clean:
	$(RM) $(OBJS) $(TARGET)

こんな感じカナ?
TARGETだったりOUTPUTだったりは人によって様々。

あと"$(TARGET):"のとこと"%.o:"のとこは別に暗黙のルールがあるので書かなくていいかも。
というか書かないほうがいいかも。

"%.o: %.c"のところは、昔は".o.c:"と書いたらしいのだが、今は前者がいい感じらしい。

".PHONY:"は"all"とか"clean"とかいう名前のファイルがあったときにmakeがうまくいかないのを防ぐため。
ダミーターゲットとかいうんだっけな?


あと、最近書いた動画エンコード用のMakefile
動画サイトとか見ながらブラウザとかのキャッシュを./src/にひたすらコピー。
で、適当にmakeを叩くと京ポン2*1用の動画が吐けると。
あとおまけでwavとmp3も吐いてる。

適当にいじると何かに使えるかも。

SRC_PREFIX=./src/
SRC_SUFFIX=.flv

GPP_PREFIX=./3gp/
GPP_SUFFIX=.3gp

MP3_PREFIX=./mp3/
MP3_SUFFIX=.mp3

WAV_PREFIX=./wav/
WAV_SUFFIX=.wav

# この辺結構奇麗に書けた気がする。(自画自賛
SRCS=$(wildcard $(SRC_PREFIX)*$(SRC_SUFFIX))
GPPS=$(patsubst $(SRC_PREFIX)%$(SRC_SUFFIX),$(GPP_PREFIX)%$(GPP_SUFFIX),$(SRCS))
WAVS=$(patsubst $(SRC_PREFIX)%$(SRC_SUFFIX),$(WAV_PREFIX)%$(WAV_SUFFIX),$(SRCS))
MP3S=$(patsubst $(SRC_PREFIX)%$(SRC_SUFFIX),$(MP3_PREFIX)%$(MP3_SUFFIX),$(SRCS))

.PHONY: all
all: $(GPPS) $(WAVS) $(MP3S)

# patsubstの第一、第二引数そのまま!!
$(GPP_PREFIX)%$(GPP_SUFFIX): $(SRC_PREFIX)%$(SRC_SUFFIX)
	@echo -e "\033[34m$^ to $@.\033[m"
	@ffmpeg \
	-y \
	-i "$^" \
	-vol 60 \
	-b 64k \
	-vcodec libxvid \
	-s 240x176 \
	-r 14.985 \
	-acodec libfaac \
	-ac 2 \
	-ar 16000 \
	-ab 32 \
	-f 3gp \
	"$@"
	@echo -e "\033[34m$@ done.\033[m"

$(WAV_PREFIX)%$(WAV_SUFFIX): $(SRC_PREFIX)%$(SRC_SUFFIX)
	@echo -e "\033[34m$^ to $@.\033[m"
	@mplayer "$^" -vo null -ao pcm:fast:file="$@" -msglevel all=-1
	@echo -e "\033[34m$@ done.\033[m"

$(MP3_PREFIX)%$(MP3_SUFFIX): $(WAV_PREFIX)%$(WAV_SUFFIX)
	@echo -e "\033[34m$^ to $@.\033[m"
	@lame "$^" "$@" --silent
	@echo -e "\033[34m$@ done.\033[m"

なぜか音声抜き出しにmplayerを使うというね...。

あ、ディレクトリ作るように書いておくとなおいいかも。

SRC_PREFIX=./.mozilla/firefox/hogehoge.default/Cache/ SRC_SUFFIX= make -e

とかすると任意のディレクトリの動画をエンコできる。
引数の"-e"は環境変数Makefileの中身より優先させるオプション。

*1:京ポン2:WillcomPHS WX310Kのこと