2017-04-06 1 views
0

* .s 파일을 입력 파일로, 확장명을 출력 파일로 삭제하려고합니다. ($basename ...)과 즉각적인 바인딩을 사용할 수 있다고 생각했지만 작동하지 않습니다. 내 최소한의 예 :Makefile : immedate가 지연 평가 되었습니까?

INPUT := *.s 
OUTPUT := $(basename $(INPUT)) 

all: 
    echo 'input:' $(INPUT) 
    echo 'output:' $(OUTPUT) 

실행

echo 'input:' *.s 
input: hello.s int3.s 
echo 'output:' * 
output: Makefile int3 hello hello.o hello.s int3.s 

내가 := 즉각적인 평가를 강제 것이라고 생각 발생하지만, 실제로 게으른 바인딩을 할 것, 그리고베이스 이름이 ".S"를 제거합니다 로부터 "*". 따라서 디렉토리의 모든 파일이 생성됩니다. 이 확장 프로그램이 제거 된 .s 파일을 내게 제공하는 방법은 무엇입니까?

INPUT := *.s 

로 :

INPUT := $(wildcard *.s) 

*.s의 첫 번째 원인을 즉시 할당 INPUT에, 당신이 이 원하지 않는

답변

1

당신은 교체해야합니다. 두 번째는 이라는 파일 이름 목록을 즉시 할당하여 사용자가 원하는 $(wildcard *.s)의 확장으로 만듭니다. 당신이 변수를 정의 할 때

와일드 카드 확장이 발생하지 않습니다

4.4.1 Wildcard Examples 및 참고 사항을 참조하십시오. 따라서, 당신은이를 작성하는 경우 :

objects = *.o 

다음 변수 개체의 값은 실제 문자열 '* .o 인'입니다. [...] 사용하는 대신에, 확장 개체를 설정하려면 :

objects := $(wildcard *.o) 
+0

따라서는'경우 : = ''이 *을 평가하는 '의미하지는 않습니다, 어떻게'='연산자에서이 다르다 ? – Ant6n

+0

@ Ant6n 안녕하세요. 업데이트를 참조하십시오. –

관련 문제