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
직접 구문 분석할 수 있는 형식으로 변경한 다음 단순화하는 것입니다 -include
. make
이를 생성하고 완료되면 자동으로 다시 실행하는 방법을 알게 됩니다. 현재 파일을 생성하는 규칙 내에서 변환을 수행하거나 별도의 규칙을 추가하여 다른 파일을 생성할 수 있습니다.
예를 들어 다음을 입력하세요 Makefile
.
-include datafile
all:
echo VAR is $(VAR)
datafile: Makefile
echo "VAR=value" > $@
처음 실행하면 make
생성된 명령이 표시됩니다 datafile
. 를 사용하면 다시 실행하여 읽을 수 있는 위치를 make -d
알려주는 줄이 표시됩니다 .Re-executing[1]: make -d
make
datafile
run- make
once가 datafile
있으면 한 번만 실행됩니다. 그러나 종속성이 있으므로 편집하여 다른 문자열로 Makefile
변경하면 올바르게 다시 생성됩니다.value
datafile