makeファイルでevalを使用する

makeファイルでevalを使用する

buildroot makeを実行すると、このビルドプロセス中にテキストファイルが生成されます。これが発生した後、ビルドの一部として別のmakeが実行されます。生成されたファイルの内容を変数として読み込んで使用したいと思います。私のbuildroot makeが起動したときにファイルが存在しないと思うので、うまくいきません。したがって、コードが実行される前に生成されたとしても、makeはすでにファイルが存在しないと判断しました。

読み取ったファイル形式:

  str1 str2 1.1.0_nightlybuild (1389:1497M@trunk)

evalを使用しようとしています(実行時にファイルの内容を確認する必要があります)。ただし、問題が引き続き発生し、ファイルを作成した後にファイルを読み取ることができないようです。 makeが変数を拡張しているようで、evalが機能しないようです。

ファイル内容では変数は設定されません。確認してみると、ファイルが正しく生成されたので、再度 make を実行すると、ファイルが生成されても問題はありません。 evalがこれを行う正しい方法ではありませんか?

したがって、makeが起動するとファイルは存在しませんが、存在し、次のコードが実行されます。

define EXAMPLE
    $(eval s := $(shell cat output/target/version.txt)) 
    $(eval FILENAME_BIN=$(word 1, $(s)).$(word 2, $(s)).$(word 3, $(s)).bin)
    $(eval FILENAME_JFFS2=$(word 1, $(s)).$(word 2, $(s)).$(word 3, $(s)).jffs2)
    mv $(BINARIES_DIR)/$(BOOTIMAGE) $(BINARIES_DIR)/$(FILENAME_BIN)
    mv $(BINARIES_DIR)/$(JFFS2IMAGE) $(BINARIES_DIR)/$(FILENAME_JFFS2)
endef

機能せず、ファイルが生成され、後続のビルドは機能しますが、プロセスの開始時にファイルが存在しない最初のビルドは機能しません。初めてファイルが呼び出され、...binファイル...jffs2から読み込まれた変数は埋められません。動作すると、ファイルが呼び出されます。str1.str2.1.1.0_nightlybuild.bin str1.str2. 1.1.0_nightlybuild.jffs2

実際のユースケースmakefileは次のとおりです。http://pastebin.com/6GdKcUg6TEST_DEFAULT_RENAMEは、ファイルを読み取ろうとしている場所です。私はbuildrootを使用しています(それでmakeファイルがたくさんあります)。 buildroot中にmakeを押すとversion.txtが生成され、このコードは読み取りを試みます。しかし、makeと入力する前にbuildrootディレクトリにversion.textがないと機能しません。ご覧のとおり、catを介して他の場所でversion.txtを使用していますが、うまくいきます。

ベストアンサー1

最善の解決策は、ファイル形式をmake直接解析できる形式に変更してから単純化することです-includemakeこれを作成して完了すると、自動的に再実行する方法がわかります。現在のファイルを生成するルール内で変換を実行するか、別のルールを追加して別のファイルを生成できます。

たとえば、次のように入力しますMakefile

-include datafile

all: 
    echo VAR is $(VAR)

datafile: Makefile
    echo "VAR=value" > $@

初めて実行すると、生成されたmakeコマンドが表示されますdatafile。を使用すると、再実行して読み取ることができる場所をmake -d示す行が表示されます。Re-executing[1]: make -dmakedatafile

run make-once がdatafileある場合は一度だけ実行されます。ただし、依存関係があるため、編集して別の文字列にMakefile変更すると、正しく再生成されます。valuedatafile

おすすめ記事