定番の make ですが、ネット見ても断片的な情報が多かったので、備忘録的なまとめです。
下記に記載の2ファイルと、.c ファイル達を同じフォルダに入れて、
chmod +x make.sh # 初回のみ
./make.sh
で、CPUコア数+1の並列コンパイルされます。
フォルダに入れたりしたい方は、適時相対パスにしてください。
(Makefileのインデントは、タブで行うこと)
EXEC = test
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c,%.o,$(SRCS))
# CFLAGS = -g -O0 -pipe -Wall
CFLAGS = -O2 -pipe -Wall
LDLIBS = -lm -pthread
all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^ $(LDLIBS)
%.o:%.c
$(CC) $(CFLAGS) -c -o $@ $<
clean:
rm -f $(EXEC) *.o
SRCSで、全ての .c ファイルを抽出
OBJSで、上記の .o 版リストを作成
実行ファイル test を作成しようとするが、依存関係により、.o ファイル群が見つからないため後回し
同フォルダ内にある全 .c ファイルをコンパイルし、.oを作成
全ての .o をリンクし、実行ファイルを作成
make clean で実行ファイル、中間ファイルを削除
※ CFLAGS、LDLIBS で与えるオプションは適時書き換えてください
# !/bin/bash
JOBS=$[$(grep cpu.cores /proc/cpuinfo | sort -u | sed 's/[^0-9]//g') + 1]
if [ $JOBS = '1' ]; then
JOBS=$[$(grep processor /proc/cpuinfo | wc -l) + 1]
fi
make -j${JOBS} $1
1行目:bashを指定(shだと加算でエラー)
3行目:grep cpu.cores /proc/cpuinfo
でCPUコア数が取れるが複数行見つかる
sort -u
で1行だけ取り出し、+1
する
4~6行目:/proc/cpuinfo
にcpu.cores
行が無い環境の場合、JOBS
には 1 (最後に加算したもの)が入っているため、CPUコア数を取るのを諦めて、代わりに論理プロセッサ数を拾ってくる
grep processor /proc/cpuinfo
で論理プロセッサ数だけ、プロセッサ番号の行が抽出される
wc -l
で行数を数え、+ 1
する
5行目:make
に並列数指定。
$1
でコマンドライン引数を拾っているため、./make.sh clean
にも対応
※:コア数+1するのは、それくらいが一番パフォーマンス出る、と、どこかで見たからです。