다른 데이터 파일의 전체 내용이되는 값인 makefile에서 즉석에서 변수를 만들려면 어떻게해야합니까?
답변:
Makefile의 변수를 다른 파일의 내용으로 설정하는 것을 좋아한다고 생각합니다.
FILE=test.txt
VARIABLE=`cat $(FILE)`
target:
echo $(VARIABLE)
VARIABLE
문자열 cat $(FILE)
(따옴표로 묶음)입니다. 그 값을 $(info ${VARIABLE})
.
VARIABLE
약속 으로 생각하면 됩니다. 이 버전은 이전 버전에서 작동하는 유일한 버전입니다 make
. :=
및 둘 다 $(shell ...)
GNU 확장입니다.
cat
규칙이 실행될 때마다. 이것은 일반적으로 의도 된 것이 아니며 느리기 때문에 경고해야합니다. 게다가 파일이 파이프이면 의도하지 않은 부작용이 있습니다. :=
변수가 대체 될 때 규칙이 평가되지 않고 변수가 정의 될 때 규칙이 평가되도록 지정해야합니다 . 대체 값은 명령이 나중에 레시피 규칙이 아닌 make에 의해 제자리에서 실행 $(shell cat $(FILE))
되도록 해야합니다 cat
.
cat
복잡한 대체 규칙 대신에 의존 하면 makefile을 훨씬 이해하기 쉽고 거의 이식 가능하거나 때로는 이식성이 더 높아집니다.
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
버전 3에서 작동하는보다 이식 가능한 솔루션 file
입니다. 단점은 프로세스에서 임시 파일을 만들어야한다는 것입니다.
$(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)