MinGWにおける単一のCソースファイルからのアプリのビルドを省力化する

id:eel3:20090422:1240404222 と微妙に絡んでくる話。

日頃からMinGWには大変お世話になっている。というかVisual C++をインストールしてあるのに、MinGWばかり使っているのは微妙かもしれない。

  1. 警告レベル最大でコンパイルして警告の有無をチェックするのに使用。
  2. 単体テスト用アプリのビルドに使用*1
  3. CやC++で書いた、ちょっとしたツールをビルドするのに使用。
  4. 新人教育で書かせたCのソースをチェックするのに使用。

さて、上記の1〜2については省力化の為にプロジェクト毎にMakefileを書いて処理を自動化している。

問題は3〜4だ。3のケースでは、大抵1つのファイルにソースコードを収めてしまうので、わざわざMakefileを書くのも面倒だ。4のケースでは、そもそもMakefileを書くのがアホらしい。

ということで、暫く前から単一のCソースファイルからアプリをビルドする専用のバッチファイルを使用している。何度かマイナーチェンジを経て、現在はこんな感じ。

@echo off
:: cc.bat
:: gcc での単発コンパイル省略バッチファイル

setlocal

	set WARN=-Wall -ansi -pedantic -pedantic-errors
	set WARN=%WARN% -Wshadow -Wpointer-arith -Wsign-compare -Wstrict-prototypes -Wmissing-declarations -Wmissing-prototypes
	set WARN=%WARN% -Wextra -Wformat=2 -Wcast-qual -Wcast-align -Wwrite-strings -Wfloat-equal
	set WARN=%WARN% -Wstrict-aliasing=2 -Wdeclaration-after-statement -Wbad-function-cast -Winline
	set WARN=%WARN% -Winit-self -Wswitch-default -Wswitch-enum -Wundef -Wno-multichar -Wunreachable-code -Wunused-macros

	:: 引数の数をチェック
	set NPARAM=0
	for %%i in (%*) do (
		set /a NPARAM+=1
	)
	if %NPARAM% LSS 1 (
		echo usage: %~nx0 SRC_FILE [OPTION...]
		exit /b 2
	)

	gcc %WARN% -o %~dpn1.exe %*

	endlocal
@echo on

警告用のオプションが多いのは仕様です。もしかしたら「Cプログラマ養成ギブス」的な効果があるかもしれない*2

このバッチファイルは「ソースファイル名≒実行ファイル名」という前提で書いてあり、

cc.bat foo.c

と実行すると、foo.cと同じディレクトリ上にfoo.exeという名前で実行ファイルがビルドされる。

引数の数の制限はわざと緩くしている。「第一引数にソースファイル名を指定する」という点さえ守っているなら、

cc.bat foo.c -DNDEBUG

などの書き方も可能なので、ライブラリのリンクもできる。

ちなみに、似たようなノリでc++.batというC++用のバッチファイルも作ったけど、頑張ればcc.batに統一できるかもしれない*3

*1:gcovを使うには、gccでビルドする必要がある。

*2:出てきた警告を全て適切に潰していくのなら。

*3:ソースファイルの拡張子で処理を分岐するとか。