Open3
Makefileについて
Makefileがあるディレクトリを取得する
curdir := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
do:
@echo $(curdir)
`$(dir $(abspath $(lastword $(MAKEFILE_LIST))))`の長い説明。
次のMakefileを例になぜ小難しい方法でカレントディレクトリを取得するのか説明します。
/tmp/Makefile
include env
do:
# 1. このタスクを実行しているMakefileと,includeしたファイルの名称リスト
@echo $(MAKEFILE_LIST)
# > Makefile env
# 2. 名称リストの最後の要素を取得する
@echo $(lastword $(MAKEFILE_LIST))
# > env
# 3. 最後の要素の絶対パスを取得する
@echo $(abspath $(lastword $(MAKEFILE_LIST)))
# > /tmp/env
# 4. 最後の要素の絶対パスのディレクトリ名を取得する
@echo $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
# > /tmp/env/
ビルトインのCURDIR変数でも同じ値取れそう🤔
-
makeコマンドを実行したパスが取れる
- makeコマンドは
-f,--file,--makefile
オプションでファイルを指定して実行することができるmake -f /tmp/Makefile
make --file=/tmp/Makefile
make --makefile=/tmp/Makefile
- makeコマンドは
-
次のMakefileの出力結果は全て同じ
/tmp/Makefiledo: @echo `pwd` @echo $(shell pwd) @echo $(CURDIR) @echo $(abspath .) @echo $(realpath .)
make # > 実行結果 # /tmp # /tmp # /tmp # /tmp # /tmp cd / make -f /tmp/Makefile # > 実行結果 # 😩 欲しいのはmakeコマンドを実行したパスじゃないのよね # / # / # / # / # /
そんな訳でこめんどくさい方法でカレントディレクトリを取得しなきゃダメーって話でした。
定数と変数
- 🧐 変数の代入の仕方で変数の種類が変わる
-
:=
: 定数 -
=
: 変数
-
message = こんにちわ
const := やぁやぁ、$(message)
mutable = やぁやぁ、$(message)
message = こんばんわ
say:
@echo $(const)
@echo $(mutable)
make say
# 🧐 こっちは「こんにちわ」のまま変わってない
# > やぁやぁ、こんにちわ
# 🧐 こっちは「こんばんわ」に変わった!
# > やぁやぁ、こんばんわ
変数の内容が表示されない
Makefile
OH_NO := "🤯"
G := "🤓"
ok:
# これは'OH_NO'という変数が展開される
@echo var: $(OH_NO)
ok2:
# これも'OH_NO'という変数が展開される
@echo var: ${OH_NO}
ng:
# これは定義していない'O'という変数が展開され、何も出力されず
# 以降の'H_NO'という文字列が出力される
@echo var: $OH_NO
one_letter:
# 1文字の変数は括弧を省略することができる
@echo var: $Ggeek$Ggeek$Ggeek
# make ok
# > var: 🤯
# make ok2
# > var: 🤯
# make ng
# > var: H_NO
# make one_letter
# > var: 🤓geek🤓geek🤓geek
- 🧐 1文字の変数は括弧を省略することができる
- 🧐 変数展開は
$()
でも${}
でもOKだけど$()
の方が一般的