#author("2023-02-21T16:11:35+09:00","","")
#author("2023-03-24T23:03:03+09:00","","")
#topicpath

///////////////////////////////////////////////////////////////////////////////
* 目次 [#c7c4b126]
#contents();

///////////////////////////////////////////////////////////////////////////////
* 自動変数 [#g4e6722a]
|~自動変数  |~意味                                     |~備考 |
|$@         |ターゲットのファイル名                    | |
|$%         |ターゲットファイルがアーカイブメンバだったときのターゲットメンバ名 | |
|$<         |最初の依存するファイル名                  | |
|$?         |ターゲットより新しい全ての依存ファイル名 | |
|$^         |全ての依存するファイル名                  | |
|$+         |Makefile と同じ順番の依存するファイル名   | |
|$*         |サフィックスを除いたターゲット名          | |


///////////////////////////////////////////////////////////////////////////////
* デバッグシンボルの分離 [#o121be49]
** 目的 [#uaa1a8ea]
- 生成した実行形式にデバッグ情報を取り除くことにより、クラッキングされ難くする
- デバッグシンボルを取り除いてもデバッグが可能となるよう、デバッグシンボルを別ファイルに保存しておく

//=============================================================================
** Makefile の実施例 [#z5786ffe]
 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)に分割される


///////////////////////////////////////////////////////////////////////////////
* 関数・制御 [#v17c6436]
//=============================================================================
** call [#func_call]
- 書式
 $(call <variable>,<param1>,<param2>,…)
- パラメータ化した関数を作る。
- call で呼び出す「関数」にあたるのは <variable> になる。これを別途定義しておく。
-- 例
 test_func = $(1) $(2)
 # $(1), $(2) は引数となる。
 
 # 呼び出し:
 $(call test_func,12,14)

//=============================================================================
** foreach [#g83cc6b0]
** foreach [#func_foreach]
- 書式
 $(foreach <ITERATOR>,$(配列), 処理)
-- 複数の処理を記述することも出来る。但し改行する場合は行末にバックスラッシュでエスケープしてやる必要がある:
 $(foreach <ITERATOR>, $(配列) \
     処理1 \
     処理2 \
     ...   \
 )

//=============================================================================
** info [#sff7ed80]
** info [#func_info]
- 任意の文字列や変数の値を表示する
- 書式
 $(info 文字列や変数など)

//=============================================================================
** subst [#jd707743]
** subst [#func_subst]
- 任意の文字列を検索して置き換える
- 書式
 $(subst <置換対象の文字列>,<置換後の文字列>,<元の文字列>)
- 例
 LIBFILE := libhoge.a
 SOLIB   := $(subst .a,.so,$(LIBFILE))  # SOLIB には libhoge.so という文字列が格納される

//=============================================================================
** 分岐 [#xf6ec3f7]
** 分岐 [#ifeq]
- ifeq
-- 例:変数 HOGE の値が 1 の場合、 CXXFLAGS に -D__CONFIG_A__ を追加する
 ifeq ($(HOGE),1)
 CXXFLAGS += -D__CONFIG_A__
 endif
- ifdef
-- とある変数が定義されている場合、その値が何かにかかわらず所定の処理を行う
-- 例:変数 FOO が定義されている場合に、CXXFLAGS に -D__CONFIG_A__ を追加する
 ifdef FOO
 CXXFLAGS += -D__CONFIG_A__
 endif


///////////////////////////////////////////////////////////////////////////////
* 全ての変数の値を知る [#q6a91896]
- 全ての変数は、$(.VARIABLES) に格納されているので、これを foreach で回してダンプする
 @$(foreach var,$(.VARIABLES),$(info $var=$($var)))


///////////////////////////////////////////////////////////////////////////////
* シェルコマンドの結果を得る [#e84175b0]
- date などのコマンドの実行結果を変数に格納するには以下のようにする
 # date の実行結果を変数 HOGE_DATE に格納する
 HOGE_DATE := $(shell date +%F)

///////////////////////////////////////////////////////////////////////////////
* 参考リンク [#r2948aa7]
- [[Makefileの関数>https://qiita.com/chibi929/items/b8c5f36434d5d3fbfa4a]]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS