競技プログラミング用(C++)のコンパイルを簡単にできるようにしてみた
概要
C++で競技プログラミング(Atcoder)を行なっているのだが、VScode のターミナル上での自動コンパイルがどうも肌に合わず、iTerm 上でいちいちコマンドを打ってコンパイルして確認をしていた、その作業に慣れはしたもののやはりめんどくさいかつ typo に気を取られることが多くなったのでできるだけ簡単なコマンドでコンパイルを行えるように sh スクリプトと makefile を書いてみたという記録。
コンパイル対象のファイルを作成する
Atcoder の ABC の問題を解く際に mainA.cpp ~ mainF.cpp ファイルを作成してそこにコードを記入するのでこのファイル群をコマンド一つでコンパイルできるようにする。
mkdir contest
contest ディレクトリ内に以下のファイルを用意する。
build.sh
#!/bin/sh
make mainA
make mainB
make mainC
make mainD
make mainE
make mainF
自分も知らなかったのだが mainA.cpp ファイルがある際に make mainA(file 名の拡張子抜き)を打つとコンパイルできる、便利。
makefile
build: build.sh
./build.sh
clean:
rm mainA
rm mainB
rm mainC
rm mainD
rm mainE
rm mainF
touch:
touch mainA.cpp
touch mainB.cpp
touch mainC.cpp
touch mainD.cpp
touch mainE.cpp
touch mainF.cpp
もちろん build.sh は実行できるように権限を変更しておく。
chmod +x build.sh
以上で下準備は完成だ。
実行
make (もしくは make build)と打ち込むだけで全てのファイルをコンパイルすることができる。
>>> make
./build.sh
c++ -I/usr/local/opt/openjdk/include mainA.cpp -o mainA
make[1]: `mainB' is up to date.
make[1]: `mainC' is up to date.
make[1]: `mainD' is up to date.
make[1]: `mainE' is up to date.
make[1]: `mainF' is up to date.
前回のコンパイルからファイル内容を変えていない場合はmake[1]: `mainB' is up to date.
のようにコンパイルしないで飛ばすので効率的。あとは実行してコードのテストをすれば OK
>>> ./mainA
hogehoge
感想
以上の準備をすることでコンパイルを脳死で行うことができるようになった。今考えれば build.sh ファイルのコマンドをそのまま makefile に書いてしまえば良さそうだが動作しているのでよしとする(一度完成したのを直すのめんどくさい)。
自動化をめんどくさがる癖があるのでことあるたびに sh スクリプトや makefile をちょくちょく書く癖をつけたいです。