晴耕雨読

work in the field in fine weather and stay at home reading when it is wet

クロスプラットフォームで make

Makefile で OSごとに違う処理を行う方法について。

uname を使う

uname は OS の名前を表示するためのコマンドです。 これを Makefile から呼び出すには $(shell uname) と書きます。 また、Makefile での文字列の比較は、ifeq ディレクティブでできます。

UNAME := $(shell uname)

ifeq ($(UNAME), Darwin)
# MacOS での処理
LIBS += -framework GLUT -framework OpenGL -lm
else
ifeq ($(UNAME), Linux)
# Linux での処理
LIBS += -lglut -lGL -lGLU -lm
else
# Cygwin での処理
LIBS += -lglut32 -lglu32 -lopengl32 -lm
endif
endif

Cygwin で uname すると、いろいろ余分な情報(バージョン番号とか何か)も一緒に表示されるので、 Cygwin の uname を ifeq することはできませんでした。 したがって、この例のように、uname の結果が Darwin でも Linux でもない場合は、Cygwin だと判断しています。