1
2

More than 1 year has passed since last update.

Makefileでできることをすべて列挙してみた

Last updated at Posted at 2021-10-17

毎日のように1つのMakefileだけで50Mバイトぐらい自動生成しているなのたんです。

Makefileでできるすべてを知る限り列挙してみました。

makeコマンドはプログラム開発ツールではなく、並列依存解決ツールとして考える

もちろんプログラムを作るにあたっても、ソースコードやライブラリ、ドキュメント等に依存関係ができます。

しかし、それ以外にも以下のようなことにも使えます

・単なる自動画像加工
・OSのビルド
 さすがにOSのビルドについては既にMakefileが定義されています。
・定義されたソースファイルを元に作曲(MIDIファイルやWAVファイルの生成、MP3等への変換)
・テキストにルビをつける
・APIを利用したインターネットの自動検索
・シングルスレッド計算における容易なマルチスレッド実行
・圧縮
・画像・動画変換
・気象状況等の並列計測(要専用ハードウェア)

これだけではまだ語りきれない、古くからある夢のツールとも言えます。

Makefileにすれば、なんでも実質上のマルチスレッドみたいになる。

make -j (数字)

Makefileさえかければ、この非常に単純なマジックで、
同時実行プロセスを設定できます。

今のうちの場合、Ryzen7 3700X DDR4-3200メモリですので
8コアにSMTがあって

make -j 16

とすべきなんですが、
実際はmakeコマンドやOS側の余剰があり、更にスレッドが実行できて、CPU時間がもったいないので

make -j 20

としています。

Makefileのターゲットファイルは何個もあってもよい

今手持ちのMakefileを確認したら、74538個もターゲットがありました。

こんなにターゲットがあっても make コマンドはとても軽快に実行してくれます。

perl版 簡易Makefile生成スクリプト(画像加工用)

#!/usr/bin/env perl
my @maketarget;
my @makecmd;
my $makefile="Makefile";

foreach my $loop(@なにかのループ)
    my $target=<<EOM;
(tab)   $loop \
EOM
    my $cmd=<<EOM;
$loop: $loop.src
(tab) (command) $loop.src > $loop

EOM
    push(@maketarget, $target);
    push(@makecmd, $cmd);
}

open(my $fh, ">$makefile") || die "Can't write $makefile\n";
print $fh "all: \\";
foreach(@maketarget) {
    print $fh "$_\n";
}
print $fh "\n";

foreach(@makecmd) {
    print $fh "$_\n";
}
close($fh);

実際の画像自動加工、画像変換のスクショ例

image.png

さいごに

自分の環境で動かすのであれば、プログラムのマルチスレッド化よりも非常に容易ですので、ぜひ試してみて下さい。

1
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
1
2