makefileからオンザフライで変数を作成するにはどうすればよいですか。その値は別のデータファイルの内容全体になります。
回答:
Makefileの変数を別のファイルの内容に設定したいと思います。
FILE=test.txt
VARIABLE=`cat $(FILE)`
target:
echo $(VARIABLE)
VARIABLE
文字列cat $(FILE)
(引用符で囲まれています)です。のようにその値を出力してみてください$(info ${VARIABLE})
。
VARIABLE
約束として考えなければなりません。これは、の古いバージョンで動作する唯一のバージョンですmake
。:=
と$(shell ...)
は両方ともGNU拡張機能です。
cat
、ルールが実行されるたびに実行されます。これは通常意図されたものではなく、遅いので警告する必要があります。さらに、ファイルがパイプの場合、意図しない副作用が発生します。:=
変数が置き換えられたときではなく、変数が定義されたときにルールが評価されないように、割り当てはwithである必要があります。置換値は$(shell cat $(FILE))
、cat
コマンドが後でレシピルールによってではなく、makeによってインプレースで実行されるようにする必要があります。
cat
複雑な代替ルールではなく依存することで、メイクファイルの理解がはるかに簡単になり、ほとんど移植性が高くなるか、場合によってはより移植性が高くなります。
GNU makeを想定すると:
file := whatever.txt
variable := $(shell cat ${file})
GNU makeバージョン4.2はファイル読み取り操作をサポートしているため、Maxim Egorushkinのすばらしい答えに関して、この問題を解決するためのオプションの方法があります。
FILE := test.txt
variable :=$(file < $(FILE))
$(file op filename)
追加されてからはるかに簡単になりました。
VARIABLE = $(file < my_file.txt)
マニュアルページはこちら:https://www.gnu.org/software/make/manual/html_node/File-Function.html#index-file_002c-reading-from
GNU makeを使用している場合、この効果を得る別の方法は、別のmakefileのmake「include」を使用することです。
Makefileから:
include "./MyFile.mak"
次の内容のファイル「MyFile.mak」を作成します。
FILE := "my file content"
FILE += "more content 1"
FILE += "more content 2"
Makefile:1: "./MyFile.mak": No such file or directory
make -v
与えGNU Make 3.81
include ./MyFile
これMAKE
は、file
ディレクティブが使用できないバージョン3で機能するより移植性の高いソリューションです。欠点は、プロセスで一時ファイルを作成する必要があることです。
$(shell echo define my_variable > file.tmp)
$(shell cat my_file.txt >> file.tmp)
$(shell echo endef >> file.tmp)
include file.tmp
主なアイデアはdefine
、複数行変数を宣言するために特別に設計されたディレクティブを使用することです。もちろん、shell
Makefileで使用するためにファイルの内容を明示的に書き込むことができれば、一時ファイルの使用を避けることができます。
ファイルに$
記号が含まれている場合、MAKE
展開されるときmy_variable
(または割り当てられるときは、で定義する:=
)に変数/ディレクティブとして展開しようとすることに注意してください。それを避けたい場合は、ファイルの内容を含める前にそれらをエスケープする必要があります。たとえば、代わりにcat
これを行うことができます:
$(shell sed 's/\$$/$$$$/g' my_file.txt >> file.tmp)