Makefile : ライブラリの置き場所が環境によって変わるときの対処について考える

ふつーにlinuxディストリビューションとかの開発環境を使っている分にはまず問題にならないんだけど、組み込み業界ではベンダーから新しい開発環境をもらうたびにディレクトリ構成が変わっちゃって「今まで /libの下にあったライブラリXが /usr/libの下に変わっちゃったよ?」ということがたまにある。そのとき Makefileを下のように書いといて対処していたんだけど、エラーメッセージも読まない、Makefileの書き方も分からない(勉強してくれない)人が「こんぱいるできませんばぐですなんとかしてください」と言ってくるのが大変鬱陶しいというか、そもそもいつまで開発環境更新しないで作業してんだこの(ry  というダークな考えに支配されて精神的にどんどん不健康になる。

# LIBS += "$(SYSROOT)/lib/libX.a"
LIBS += "$(SYSROOT)/usr/lib/libX.a" #最新版はこっちね!

ので、そういう精神的苦痛から自分を解放することにした。

とりあえずこれ書いてるmacbookで実証したMakefileはこんな感じ。 MacPortsSDLを見つける定義。実際は /opt/local/lib以下にあるんだけど、 /opt/local/usr/libの下にもあるかもって仮定している。

SYSROOT:=/opt/local

LIBSDL1 := $(shell find $(SYSROOT)/usr/lib/libSDL-1.2.0.dylib 2>/dev/null)
LIBSDL2 := $(shell find $(SYSROOT)/lib/libSDL-1.2.0.dylib     2>/dev/null)
LIBSDL  := $(firstword  $(LIBSDL1) $(LIBSDL2))

all:
	@echo $(LIBSDL)

.PHONY: all
% make
/opt/local/lib/libSDL-1.2.0.dylib

shell関数で findコマンドを動かしてファイルの存在を調べる。ファイルが存在しない場合、LIBSDL1や LIBSDL2は空になる。それをリストにして、 firstword関数を使って最初に見つかったファイルを優先的に使う事にする。

こんな簡単なことならさっさとやっておくべきだった。「誰かが調べて直してくれるかも」なんて期待しちゃいけないんだな。

[修正] 「-Lでいいじゃん」て指摘されて、いやいや shared libならそれでいいけどさーって思ったらサンプルでしっかり .soと書いてあって自分で自分の書いた文章をバカにしそうになったので修正。 static libの話です。