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の中身より優先させるオプション。