Hatena::Grouptopcoder

hasiの日記

 | 

2011-12-22

makeのしかた

09:41

Competitive Programming Advent Calendar 22日目の記事です。

GNU makeの使い方です。

一般的にはインストールのときとかに使うものだと思うのですが、

自分がよく使う、インストール以外の使い方を紹介します。

競技的な使い方の一例として参考になったら幸いです。

コンパイル

「make (プログラム名)」だけでコンパイルできます。暗黙のルールが働いています。

$ cat >a.cpp
#include <iostream>
int main() {
	std::cout << "gudapoyo" << std::endl;
}
$ ls
a.cpp
$ make a
g++     a.cpp   -o a
$ ./a
gudapoyo
$ make a
make: `a' is up to date.

Makefile

コンパイルオプションを指定したい。Makefileを使いましょう。

-Wallと-O2をつけてみました。g++のコンパイルオプションはCXXFLAGSで指定できます。

$ cat >Makefile
CXXFLAGS = -Wall -O2
$ ls
Makefile  a  a.cpp
$ rm a
$ make a
g++ -Wall -O2    a.cpp   -o a

並列実行

いわゆる馬鹿パラレル。

makeの-jオプションを使うと簡単に並列実行できます。

Makefileスクリプトで生成して、「make -j 4」とか「make -j 8」とかで実行します。

Marathonとかでたくさん実行したいときに使っています。

マルチコアだと速くなって楽しい。

$ mkdir out
$ cat >makefile.pl
for $i (1..100) {
        push(@a,"out/$i");
}
print "all:".join(' ', @a)."\n";
for $i (1..100) {
        print "out/$i:\n\t./a -seed $i > out/$i\n";
}
$ perl makefile.pl >Makefile
$ head Makefile
all:out/1 out/2 out/3 out/4 out/5 out/6 out/7 out/8 ... (省略)
out/1:
        ./a -seed 1 > out/1
out/2:
        ./a -seed 2 > out/2
out/3:
        ./a -seed 3 > out/3
out/4:
        ./a -seed 4 > out/4
out/5:
$ make -j 4
./a -seed 1 > out/1
./a -seed 2 > out/2
./a -seed 3 > out/3
./a -seed 4 > out/4
	:
	:
$ ls out
1    14  2   25  30  36  41  47  52  58  63  69  74  8   85  90  96
10   15  20  26  31  37  42  48  53  59  64  7   75  80  86  91  97
100  16  21  27  32  38  43  49  54  6   65  70  76  81  87  92  98
11   17  22  28  33  39  44  5   55  60  66  71  77  82  88  93  99
12   18  23  29  34  4   45  50  56  61  67  72  78  83  89  94
13   19  24  3   35  40  46  51  57  62  68  73  79  84  9   95

NileshNilesh2012/11/14 20:33That hits the tagret perfectly. Thanks!

udjgbdvudjgbdv2012/11/15 12:172ZdjsX <a href="http://agskveituhta.com/">agskveituhta</a>

vdbhzuppevdbhzuppe2012/11/16 10:42JDVP89 , [url=http://gsfuxbicbcnf.com/]gsfuxbicbcnf[/url], [link=http://ffrmhckcshoj.com/]ffrmhckcshoj[/link], http://gkkpgfwblfeu.com/

lcxtnzvtklcxtnzvtk2012/11/17 11:24spbpW3 <a href="http://duybwpglmbcz.com/">duybwpglmbcz</a>

 |