MakefileのTips
環境依存性の克服
なにかと GitHub や Bitbucket のリモートリポジトリを使うことが多いので、 環境に依存しない Makefile を作っておけば git clone した時に便利。 とりあえずはWindows環境とUNIX環境で共通のMakefileを使用したい。 環境毎に分岐するには以下のようにすればよい。
# コンパイルオプションの設定 ifeq ($(OS),Windows_NT) ^I CC = $(WINCOMPILER) # 行頭の^Iはタブ文字を表す ^I OPTION = $(WINOPTION) else ^I CC = gcc ^I OPTION = -lm -lblas -llapack endif
環境変数 VALUE の内容は $(VALUE) で取得できる。 環境変数 (上の例だと $WINOPTIONと$WINCOMPILER) を定義して make を走らせるシェルスクリプトやバッチファイルを書いて、 環境依存を吸収させるとよい。このシェルスクリプトやバッチファイルを .gitignore に設定しておけば作業がスムーズに進む。
オブジェクトファイルを別ディレクトリに作成したい
ソースファイルが詰まったディレクトリにオブジェクトファイルが生成されるのは見苦しい。
別のディレクトリに生成したい。
そんな時には OBJDIR/%.o : %.c
と patsubst
を使う。
OBJS = main.o subroutine1.o subroutine2.o # サブルーチンをコンパイルして OBJS を作成 # 予め OBJDIR ディレクトリを作成しておく OBJDIR/%.o : %.c header.h ^I $(CC) $(OPTION) -c -o $@ $< # $< は一番目の依存ファイル %.c だけを指す # OBJS をリンクして a.exe を作成 # OBJS の各要素に "OBJDIR/" を付加 a.exe : $(patsubst %,OBJDIR/%,$(OBJS)) ^I $(CC) $(OPTION) -o $@ $^ # $^ は依存ファイルの全要素を指す