余白の書きなぐり

aueweのブログ

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 : %.cpatsubst を使う。

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 $@ $^           # $^ は依存ファイルの全要素を指す 

参考: Makefileの小技と新バージョンのDelFEM