0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Makefile】自動でフォルダ内の全ソースファイルを並列コンパイル&リンクし実行ファイルを生成する方法

Last updated at Posted at 2021-02-05

定番の make ですが、ネット見ても断片的な情報が多かったので、備忘録的なまとめです。

下記に記載の2ファイルと、.c ファイル達を同じフォルダに入れて、

chmod +x make.sh # 初回のみ
./make.sh

で、CPUコア数+1の並列コンパイルされます。
フォルダに入れたりしたい方は、適時相対パスにしてください。
(Makefileのインデントは、タブで行うこと)


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 で与えるオプションは適時書き換えてください


make.sh
# !/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/cpuinfocpu.cores行が無い環境の場合、JOBSには 1 (最後に加算したもの)が入っているため、CPUコア数を取るのを諦めて、代わりに論理プロセッサ数を拾ってくる
grep processor /proc/cpuinfoで論理プロセッサ数だけ、プロセッサ番号の行が抽出される
wc -lで行数を数え、+ 1する

5行目:makeに並列数指定。
$1でコマンドライン引数を拾っているため、./make.sh cleanにも対応

※:コア数+1するのは、それくらいが一番パフォーマンス出る、と、どこかで見たからです。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?