toge's diary

コンピュータ関連の趣味をつらつらと。

makefileでMinGW32だけ特殊扱い

Makefileもの2連発。

SDL-OFFとその前の準備で他人の環境への配慮の無さを反省したので、ちょっと工夫してみた。

MinGW32な環境はリンクするライブラリが結構変わってしまったり、ヘッダの場所が違ったりと、気をつけるところが多々ある。
そこでMinGW32な環境での実効を自動判別するように工夫してみた。

GCCMACHINE:=$(shell $(CC) -dumpmachine)

ifeq ($(findstring "mingw32","$(GCCMACHINE)"),"mingw32")
	LDFLAG += -lwinmm -lopengl32 -lwsock32 -lcomctl32 -lglu32
else
	LDFLAG += -lGL -lGLU -ldl
endif 

ちなみにWindows上のMinGW32/Msysのgccではgccは"mingw32"となるけれど、Linux上のi386-mingw-gccでは"i386-mingw"だった。
とりあえず両方ともに対応するため、findstringしてみました。
これでmake時にCC, CXXだけ指定すれば良くなり結構快適になった。

その分GNU makeとgccへの依存が増えたけれど。

makefileでgccバージョンごとに切り替え

今度は外部コマンドにまで依存してみる。ちなみにMsys上でも動作確認済み。

gccはバージョンごとに使える引数が結構違う。
常に最新だけ使っていれば良いならそれでもいいんだけれど、MinGW32はgcc3.x系だし、Linuxの中にはまだ4.0を使っているものあったりするので、頭が痛い。

そこで上と同じように自動判別できるようにしてみた。

GCCVERSION:=$(shell $(CC) -dumpversion)

dot:=.
empty:=
space:=$(empty) $(empty)
GCCVERSION:=$(subst $(dot),$(space), $(GCCVERSION))
GCCMAJOR:=$(word 1, $(GCCVERSION))
GCCMINOR:=$(word 2, $(GCCVERSION))

ifeq (1,$(shell expr $(GCCMAJOR) \>= 4))
  # 4.0以上用の設定
endif

ifeq (1,$(shell expr \( $(GCCMAJOR) \> 4 \) \| \( $(GCCMAJOR) \= 4 \& $(GCCMINOR) \>= 1 \)))
  # 4.1以上用の設定
endif 

makeの条件分岐には"等しい" or "定義されている"しかないので、大小判定部分はexprコマンドでやってます。

これで4.1で新設された最適化フラグも気軽に使えます。

PBO

http://rainer.blog7.fc2.com/

Mistyさんとこより。
PBOはVBOをテクスチャに拡張した代物ってことで、テクスチャデータのソースをストリーミングにしたり、描画結果をPBO/VBOを介して頂点情報にしてみたりするのに使うみたいですな。(以上 More OpenGL Game Programming の受け売り)

Mistyさんの考えられている、ストリーミングの利用にうってつけ・・・らしい。やったことないので分かりませんが。

ちなみに、VBOみたくテクスチャデータのアップロードを高速化できる用途に使ってみましたが、殆ど速くなりませんでした。トホホ。