自動変数†
自動変数 | 意味 | 備考 |
$@ | ターゲットのファイル名 | |
$% | ターゲットファイルがアーカイブメンバだったときのターゲットメンバ名 | |
$< | 最初の依存するファイル名 | |
$? | ターゲットより新しい全ての依存ファイル名 | |
$^ | 全ての依存するファイル名 | |
$+ | Makefile と同じ順番の依存するファイル名 | |
$* | サフィックスを除いたターゲット名 | |
デバッグシンボルの分離†
- 生成した実行形式にデバッグ情報を取り除くことにより、クラッキングされ難くする
- デバッグシンボルを取り除いてもデバッグが可能となるよう、デバッグシンボルを別ファイルに保存しておく
Makefile の実施例†
SHELL = /bin/sh
PROG = OOO
PROG_SYMBOL = $(PROG).sym
CXXFLAGS = \
-Wall \
LDFLAGS = \
-lstdc++ \
CXXFLAGS_DEBUG = -ggdb -D_DEBUG_
CXXFLAGS_RELEASE = -O2
LDFLAGS_DEBUG =
LDFLAGS_RELEASE =
SRCSCPP = \
a.C \
b.C \
c.C \
main.C \
SRCS = $(SRCSCPP)
OBJCPP = $(SRCSCPP:.C=.o)
OBJS = $(OBJCPP)
# Rules & Program stuff
MAKE = make
CXX = g++
CPP = g++ -E
RM = /bin/rm
RMF = $(RM) -f
CP = /bin/cp
AR = /usr/bin/ar
ARQ = $(AR) -q
STRIP = /usr/bin/strip
OBJCOPY = /usr/bin/objcopy
OBJCOPY_ONLY_KEEP_DEBUG = $(OBJCOPY) --only-keep-debug
ROOT_DEV = CURRENT
all:
@echo "WARNING: Available make target is: dbg rel clean";
dbg: build-dbg strip-symbol
rel: build-rel strip-symbol
clean :
$(RMF) $(OBJS) $(PROG) $(PROG_SYMBOL)
build-dbg: LDFLAGS += $(LDFLAGS_DEBUG)
build-dbg: CXXFLAGS += $(CXXFLAGS_DEBUG)
build-dbg: $(PROG)
build-rel: LDFLAGS += $(LDFLAGS_RELEASE)
build-rel: CXXFLAGS += $(CXXFLAGS_RELEASE)
build-rel: $(PROG)
$(PROG) : $(OBJS)
$(CXX) -o $(PROG) $(OBJS) $(CXXFLAGS) $(LDFLAGS)
strip-symbol: $(PROG)
@echo "Stripping symbols"
$(OBJCOPY_ONLY_KEEP_DEBUG) $(PROG) $(PROG_SYMBOL)
$(STRIP) $(PROG)
- 引数なしで make した場合、最初のターゲットが実行されるため、 all を最初のターゲットとなるように配置し、且つ、「引数なし、若しくは all の場合は make しない」ことを WARNING メッセージで表示するようにしている
- "make dbg" 若しくは "make rel" とした場合、プログラムが compile, link された後、 strip-symbol ターゲットでバイナリファイルが「デバッグ情報なしファイル」(PROG)と「デバッグ情報のみのファイル」(PROG_SYMBOL)に分割される
関数・制御†
foreach†
info†
- 任意の文字列や変数の値を表示する
- 書式
$(info 文字列や変数など)
subst†
- 任意の文字列を検索して置き換える
- 書式
$(subst <置換対象の文字列>,<置換後の文字列>,<元の文字列>)
- 例
LIBFILE := libhoge.a
SOLIB := $(subst .a,.so,$(LIBFILE)) # SOLIB には libhoge.so という文字列が格納される
全ての変数の値を知る†
シェルコマンドの結果を得る†
参考リンク†