Open3

Makefileについて

nacnac

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
  • 次のMakefileの出力結果は全て同じ

    /tmp/Makefile
    do:
    	@echo `pwd`
    	@echo $(shell pwd)
    	@echo $(CURDIR)
    	@echo $(abspath .)
    	@echo $(realpath .)
    
    make
    # > 実行結果
    # /tmp
    # /tmp
    # /tmp
    # /tmp
    # /tmp
    
    cd /
    make -f /tmp/Makefile
    # > 実行結果
    # 😩 欲しいのはmakeコマンドを実行したパスじゃないのよね
    # /
    # /
    # /
    # /
    # /
    

そんな訳でこめんどくさい方法でカレントディレクトリを取得しなきゃダメーって話でした。

nacnac

定数と変数

  • 🧐 変数の代入の仕方で変数の種類が変わる
    • := : 定数
    • = : 変数
message = こんにちわ
const  := やぁやぁ、$(message)
mutable = やぁやぁ、$(message)
message = こんばんわ
say:
	@echo $(const)
	@echo $(mutable)
make say
# 🧐 こっちは「こんにちわ」のまま変わってない
# > やぁやぁ、こんにちわ
# 🧐 こっちは「こんばんわ」に変わった!
# > やぁやぁ、こんばんわ
nacnac

変数の内容が表示されない

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だけど$()の方が一般的