다른 파일의 내용을 읽어서 makefile에 변수 만들기


82

다른 데이터 파일의 전체 내용이되는 값인 makefile에서 즉석에서 변수를 만들려면 어떻게해야합니까?

답변:


49

Makefile의 변수를 다른 파일의 내용으로 설정하는 것을 좋아한다고 생각합니다.

FILE=test.txt
VARIABLE=`cat $(FILE)`

target:
    echo $(VARIABLE)

3
사실, VARIABLE 정의를 무엇보다 먼저 넣을 수 없습니다. PATH_TO_MY_DATA_FILE은 all : 대상에서 일부 명령이 실행될 때까지 존재하지 않기 때문입니다. 대안으로, 내가 한 것은 두 개의 메이크 파일 (서브 메이크를 생성 함)로 나누고 서브 메이크의 상단에 VARIABLE을 선언했고 이제는 매력처럼 작동합니다.
Srinath

26
이것은 잘못된 대답입니다. 의 값은 셸에 의해 레시피에서 확장되는 VARIABLE문자열 cat $(FILE)(따옴표로 묶음)입니다. 그 값을 $(info ${VARIABLE}).
Maxim Egorushkin 2013-08-20

4
@MaximEgorushkin 틀리지 않습니다. VARIABLE약속 으로 생각하면 됩니다. 이 버전은 이전 버전에서 작동하는 유일한 버전입니다 make. :=및 둘 다 $(shell ...)GNU 확장입니다.
ceving

7
반대 투표. 이 실행됩니다 cat규칙이 실행될 때마다. 이것은 일반적으로 의도 된 것이 아니며 느리기 때문에 경고해야합니다. 게다가 파일이 파이프이면 의도하지 않은 부작용이 있습니다. :=변수가 대체 될 때 규칙이 평가되지 않고 변수가 정의 될 때 규칙이 평가되도록 지정해야합니다 . 대체 값은 명령이 나중에 레시피 규칙이 아닌 make에 의해 제자리에서 실행 $(shell cat $(FILE))되도록 해야합니다 cat.
기독교 Hujer

2
@antred, make는 cat을 포함하는 표준 UNIX / POSIX 도구 세트의 일부입니다. 설치하면 다른 모든 기본 도구를 설치하는 것이 정상이며 그로 인해 어려움을 겪는 매우 드문 경우가 있습니다. cat복잡한 대체 규칙 대신에 의존 하면 makefile을 훨씬 이해하기 쉽고 거의 이식 가능하거나 때로는 이식성이 더 높아집니다.
Michael

82

GNU make 가정 :

file := whatever.txt
variable := $(shell cat ${file})

4
@ceving 표준 GNU make를 사용합니다. Solaris make는 이식 불가능한 응용 프로그램입니다.
Maxim Egorushkin 2015

8
Gnu make는 solaris make보다 표준도 아니고 휴대 성이 뛰어납니다. "인기"는 당신의 단어입니다. 이식성과 표준 준수를 심각하게 고려한다면 posix를 고수하십시오.
把 友情 留 在 无 盐

3
이 경우에는 "Popular"를 사용하겠습니다. 비 GNU Make는 너무 원시적입니다. 1990 년대 운영 체제를 계속 지원하려는 경우 @ bb-generation의 대답이 필요할 것입니다 (많은 경우 문제가 발생할 수 있음). 다른 모든 경우에 GNU Make는 쉽게 구할 수 있거나 기본값 일 가능성이 높으므로 사용하십시오.
Guss

1
GNU make는 어디서나 실행되므로 다른 어떤 제품보다 이식성이 훨씬 뛰어납니다. "표준"은 주관적 일 수 있습니다.
MarcH

27

GNU make 버전 4.2는 파일 읽기 작업을 지원하므로 Maxim Egorushkin 의 훌륭한 답변 과 관련하여 이제이 문제를 해결할 수있는 선택적 방법이 있습니다.

FILE     := test.txt
variable :=$(file < $(FILE))

오류를 수정했습니다. 변수 이름은 대소 문자를 구분합니다. 'foo', 'FOO'및 'Foo'라는 이름은 모두 다른 변수를 나타냅니다. ( gnu.org/software/make/manual/html_node/Using-Variables.html )
Yaroslav Nikitenko

따옴표도 필요하지 않습니다. $ (file < "$ (FILE)")은 "test.txt"를 열려고합니다.
cagney

16

catWindows에는 존재하지 않습니다. Linux 및 Windows에서 작동하는 솔루션 :

cat := $(if $(filter $(OS),Windows_NT),type,cat)
variable := $(shell $(cat) filename)

설명 : Windows에는 항상 OS'Windows_NT'와 동일하게 정의 된 환경 변수가있는 것 같습니다. 이런 식으로 Windows의 경우 type명령이 사용되고 Windows cat가 아닌 경우 에는 사용됩니다.



4

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
knocte

"-v하게"아마 ... 시도는 메이크업의 없음 GNU 버전 .... 또는 GNU 메이크업의 정말 오래된 버전을 사용하는 것을 의미한다
빌 무어

번들 또는 자작으로 설치하지 않도록 경우, 맥의 메이크업을 사용, make -v제공GNU Make 3.81
knocte

Makefile에서 실수로 TAB 문자를 SPACE 문자로 변환하지 않았는지 확인합니까? Make는 이와 관련하여 파이썬처럼 거의 성가시다.
빌 무어

: 나는, 예를 들어 따옴표를 제거하여 내 맥에 의해 일이있어 include ./MyFile
찰리 트란

3

플랫폼이 지정되지 않았기 때문에 이것이 Solaris에서 작동하는 방식입니다.

VERSION:sh = cat VERSION

all:
        echo $(VERSION)

0

다음 은 디렉티브를 사용할 수없는 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변수를 선언하도록 특별히 설계된 지시문 을 사용 하는 것입니다. 물론 shellMakefile 사용을 위해 명시 적으로 파일 내용을 쓸 수 있다면 임시 파일 사용을 피할 수 있습니다.

파일에 $기호 MAKE가 포함 된 경우 확장 될 때 my_variable(또는 할당 될 때를 사용하여 정의 할 때 ) 변수 / 지시문으로 확장하려고 시도합니다 :=. 이를 피하려면 파일 내용을 포함하기 전에 이스케이프해야합니다. 예를 들어 대신 cat다음을 수행 할 수 있습니다.

$(shell sed 's/\$$/$$$$/g' my_file.txt >> file.tmp)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.