2017-10-02 1 views
0

추한 것일 수 있지만 다른 레서피에 지정된 값을 얻는 타겟 이름으로 매크로를 사용하고 싶습니다. 나는이 같은 평가 기능을 다른 조리법에 매크로/변수를 정의하는 방법을 알고 : 괜찮아요다른 레시피에서 목표 이름을 정의하십시오.

$ make say 
what ever's in this file 

:

read : 
    $(eval TEXT := $(shell cat somefile.txt)) 
say : read 
    echo ${TEXT} 

그것은 될 것입니다. 또한 매크로를 사용하여 대상 이름을 정의 할 수 있습니다. 자, 예를 들어 타르 볼과 같은 파일이 있다고 가정 해 봅시다. 이름은 항상 'program-'로 시작하고 whith '.bar'로 끝나며 그 중간에 별도의 파일에있는 버전입니다. 'program-1.2.3.tar'. 따라서 원칙적으로이 파일의 대상을 다음과 같이 정의 할 수 있습니다.

VERSION = $(shell cat version.txt) 
program-${VERSION}.tar : 
    tar cf program-${VERSION}.tar program-${VERSION} 

괜찮 았던 것입니다. 그러나 사실은 내가 : 예컨대, 단지 대상이 파일을 읽을 수

.PHONY : getversion 
getversion : 
    $(eval VERSION := $(shell cat version.txt)) 
program-${VERSION}.tar : gerversion 
    tar cf program-${VERSION}.tar program-${VERSION} 

을 싶은데 이미 처음부터 만들 호출하여 대상의 이름을 결정하기 때문에 물론이 작동하지 않습니다. 여분의 makefile을 사용하지 않고 이상한 문제를 해결할 수있는 방법이 있습니까?

+0

그래서 당신이 $ (VERSION)가 다른 뭔가도 평가 :이 모든에 메이크 파일을 단순화 thatprogram-${VERSION} 사이에 포함 된 종속성이 아니라고 결론에 매우 강하게 암시? 나는 너의 문제를 완전히 괴롭히지 않는다, 미안. 어쩌면 우리는 빌드 프로세스와 다른 버전 번호의 관계를 말할 수 있습니다. 원래의 문제를 우회하는 것이 make의 기본 논리에 반하는 것보다 낫습니다. BTW에서는 쉘 호출을 저장하는 $ (file Vroomfondel

+0

그래, $ {VERSION}은 네트워크에서 가져온 것이므로 필요할 때만 평가하고 싶습니다. 그러나 저는 그런 식으로 할 수있는 방법이 없다고 생각합니다. – weber

+0

하지만 $ (VERSION) _은 항상 필요합니다. 그렇지 않으면 빌드를 계속하는 법을 모릅니다. 시간 절약은 어디에서 왔는가? "필요할 때만"평가할 때? – Vroomfondel

답변

0

VERSIONTAR_VERSION을 대상 외부로 평가하는 것이 좋습니다. TAR_VERSION을 대상 이름으로 설정하려면 .PHONY 대상에도 추가해야합니다. 모든 것은 내가 모든 뉘앙스의 문제를 이해하면 나도 몰라

.PHONY : getversion $(TAR_VERSION) 

VERSION := $(shell cat version.txt) 
TAR_VERSION := $(addprefix program-, $(addsuffix .tar, ${VERSION})) 

getversion : 
    echo ${VERSION} 
$(TAR_VERSION) : 
    tar cf ${TAR_VERSION} program-${VERSION} 
+0

네 말이 맞아, 내가 전에 한 일이야. 하지만 버전으로 파일을 가져 오는 데는 시간이 걸리기 때문에 실제로 다른 레시피에서 실행하고 싶습니다. 지금까지 감사드립니다. – weber

+0

'VERSION'을 평가하기 전에'program - $ {VERSION} .tar'라는 타겟 이름을 얻을 수있는 방법이 없습니다. 다른 타겟에서'$ {VERSION} '을 전달할 수 있다고 생각하지 않습니다. – CWLiu

+0

나는 이미 그렇게 두려워했다. 나는 다른 방법을 찾아야한다고 생각한다. 어쨌든 고마워. – weber

0

, 이렇게 될 수 있습니다,하지만 난 당신이 실제보다 더 복잡한이보고있다 생각합니다. 당신의 설명이 이해 될 수만 있다면, 당신은 make thismake that에 사용하는 다음 메이크 파일을 가지고 있습니다. 이전은 프로그램 -xyztar에 의존하지 않는 대상이고 후자는 느린 연결을 통해 어떤 버전을 묻습니다 내가 이런 말을 할 수 있다면, 이것은 그러나 의존성이 오해

.PHONY : this that getversion 

this: 
    @echo etc.... 

that: program-${VERSION}.tar 
    @echo done with program-${VERSION} 

getversion : 
    $(eval VERSION := $(shell cat version.txt)) 

program-${VERSION}.tar : getversion 
    tar cf program-${VERSION}.tar program-${VERSION} 

: 당신은 실제로 다루고있다. that의 빌드는 특정 버전에만 의존하지 않으며 version.txt에 액세스하는 순수한 행위에만 의존합니다. 또한이 버전의 정보는 네트워크에서 제공되기 때문에 특정 버전을 지정할 수 없으므로 $ {VERSION} .tar (명령 줄에서 대상으로 전달)을 통해 현명한 특정 프로그램을 작성할 수 없습니다.

.PHONY : this that getversion 

this: 
    @echo etc.... 

that: getversion 
    @echo done with program-${VERSION} 

getversion: 
    $(eval VERSION := $(file < version.txt)) 
    tar cf program-${VERSION}.tar program-${VERSION} 
관련 문제