毎日のように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);
実際の画像自動加工、画像変換のスクショ例
さいごに
自分の環境で動かすのであれば、プログラムのマルチスレッド化よりも非常に容易ですので、ぜひ試してみて下さい。