GNU Make > 並列実行(--jobs または -j オプション)

以下のようなディレクトリ構造で、
satoshi@debian:~/git/sample-codes/gnu_make_jobs$ tree
.
|-- Makefile
|-- bar
|   |-- Makefile
|   `-- bar.c
|-- baz
|   `-- Makefile
`-- foo
    |-- Makefile
    `-- foo.c

3 directories, 6 files
satoshi@debian:~/git/sample-codes/gnu_make_jobs$ cat Makefile
.PHONY: all clean foo bar baz

SUBDIR = baz foo bar

all: $(SUBDIR)
clean:
        $(MAKE) TARGET=$@

$(SUBDIR):
        $(MAKE) --directory=$@ $(TARGET)
satoshi@debian:~/git/sample-codes/gnu_make_jobs$ cat foo/Makefile
all:
        gcc -o foo foo.c
clean:
        rm foo
普通に、makeと打てば再帰的にmakeができるが、
satoshi@debian:~/git/sample-codes/gnu_make_jobs$ make
make --directory=baz
make[1]: ディレクトリ `/home/satoshi/git/sample-codes/gnu_make_jobs/baz' に入ります
echo "baz directory"
baz directory
make[1]: ディレクトリ `/home/satoshi/git/sample-codes/gnu_make_jobs/baz' から出ます
make --directory=foo
make[1]: ディレクトリ `/home/satoshi/git/sample-codes/gnu_make_jobs/foo' に入ります
gcc -o foo foo.c
make[1]: ディレクトリ `/home/satoshi/git/sample-codes/gnu_make_jobs/foo' から出ます
make --directory=bar
make[1]: ディレクトリ `/home/satoshi/git/sample-codes/gnu_make_jobs/bar' に入ります
gcc -o bar bar.c
make[1]: ディレクトリ `/home/satoshi/git/sample-codes/gnu_make_jobs/bar' から出ます
ここで、-jobs N を指定すると並列ビルドが可能になる
satoshi@debian:~/git/sample-codes/gnu_make_jobs$ make --jobs 3
make --directory=baz
make[1]: ディレクトリ `/home/satoshi/git/sample-codes/gnu_make_jobs/baz' に入ります
echo "baz directory"
baz directory
make[1]: ディレクトリ `/home/satoshi/git/sample-codes/gnu_make_jobs/baz' から出ます
make --directory=foo
make[1]: ディレクトリ `/home/satoshi/git/sample-codes/gnu_make_jobs/foo' に入ります
gcc -o foo foo.c
make --directory=bar
make[1]: ディレクトリ `/home/satoshi/git/sample-codes/gnu_make_jobs/bar' に入ります
gcc -o bar bar.c
make[1]: ディレクトリ `/home/satoshi/git/sample-codes/gnu_make_jobs/foo' から出ます
make[1]: ディレクトリ `/home/satoshi/git/sample-codes/gnu_make_jobs/bar' から出ます

関連リンク:
英語のmakeドキュメント
サンプルコード

GNU Make   [本]

GNU Make [本]

人気の投稿