Makefile」タグアーカイブ

Makefileにforループを書く方法

シェルスクリプトのforをMakefileに書くと次のようなエラーになってしまいます。

example0:
--TAB-- for i in 1 2 3 4 5;
--TAB-- do
--TAB--   echo $$i
--TAB-- done

実行結果

$ make example0
for i in 1 2 3 4 5;
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [makefile:2: example0] Error 1

Makefileは基本的に1行ずつのコマンドを書くようになっていることが原因みたいです。ということで、Makefileでforループを使いたい場合は1行で書くようにすると良いみたいです。

example1: 1行でforループを書く方法

example1:
--TAB-- for i in 1 2 3 4 5; do echo $$i; done

実行結果

$ make example1
for i in 1 2 3 4 5; do echo $i; done
1
2
3
4
5

example2: バックスラッシュ\を使って1行にする方法

example2:
--TAB-- for i in 6 7 8 9 10; do \
--TAB--   echo $$i; \
--TAB-- done

実行結果

$ make example2
for i in 6 7 8 9 10; do \
  echo $i; \
done
6
7
8
9
10

どちらも結果は同じになりますので、読み易い書き方を使ってみてください。

※変数参照は$でなく$$にしないと使えないので気を付けてください。

リンク

Multiline bash commands in makefile – Stack Overflow
https://stackoverflow.com/questions/10121182/multiline-bash-commands-in-makefile

How to write loop in a Makefile? – Stack Overflow
https://stackoverflow.com/questions/1490949/how-to-write-loop-in-a-makefile

Makefileの書き方メモ

Makefileで個人的によく使う書き方メモ

基本的な書き方

ターゲット名: 依存ファイル
--TAB-- コマンド1
--TAB-- コマンド2

よく使うマクロ

$@ターゲット
$<依存ファイルの先頭
$^依存ファイル全て

サンプル

helloをビルド(マクロを使わないパターン)

hello: hello.c
--TAB-- cc -o hello hello.c

lesscpy.less.cssに変換(マクロを使うパターン)

lesscpy $< > $@

convertコマンドで.pngファイルを.jpgに変換(サフィックスルール)

.SUFFIXES: .jpg .png
.png.jpg:
--TAB-- convert $< $@