2014-12-24 4 views
4

나는 make을 배웠으며 뭔가 알아 내려고 애 쓰고 있습니다. 나는이 일반적인 구조로 몇 가지 규칙을 가지고있다. 나는변수를 사용하여 명령을 만듭니다.

YOUR = "yourfile.txt";\ 
    cat "myfile.txt" 
/bin/sh: YOUR: command not found 
make: *** [test] Error 1 

대신 subst 함수를 사용하면 ... 대신

cat myfile.txt yourfile.txt 

내가 다음 얻을 :

FILE = "myfile.txt" 

test : 
    YOUR = $(subst my,your,$(FILE));\ 
    cat $(FILE) $(YOUR) 

나는 최종 결과는 명령을 실행하는 기대 makefile에서 YOUR="yourfile"을 수행하면 모든 것이 정상적으로 처리됩니다. 어떤 제안이나 나는 아주 근본적으로 뭔가를 놓쳤는가? 필자는 규칙 내 명령에 대한 줄을 시작하기 위해 탭이 아닌 공백을 사용하고 있다고 덧붙여 야합니다.

답변

1
FILE = "myfile.txt" 

test : 
    $(eval YOUR = $(subst my,your,$(FILE))) 
    cp $(FILE) $(YOUR) 

당신은 조리법에 eval 기능을 사용해야합니다 (Define make variable at rule execution time)

+0

감사합니다. 좀 더 복잡한 예제 테스트에서는 $ (test)와 같을 것이고 $ @ valiable에 subst를 수행 한 다음 그 결과를 쉘 스크립트에 전달해야 할 것입니다. –

1

make이 실행하는 것과 쉘이 실행하는 것을 구별해야합니다. YOUR =의 행은 탭으로 시작하고 규칙의 일부이므로 셸에서 실행하므로 어떤 인수로 실행하려면 YOUR 프로그램을 찾을 수 없습니다.

장소 규칙 외부 확장하십시오 make로 작성하는 경우 YOUR=${FILE/my/your}을 강타에 (그리고 : 쉘 지정은 등호 주위에 공간을 필요로하지 않으며, 변수를 참조하는 ${}보다는 $()를 사용하는 것이

YOUR = $(subst my,your,$(FILE)) 

test: 
    cat $(FILE) $(YOUR) 

주 규칙의 경우 $ 대신 $$이 필요하므로 셸에서 단일 달러 기호를보고 make은 이해할 수없는 변수 확장을 시도하지 않습니다. 쉘은 $()을 사용하여 안에 포함 된 명령을 실행하고 그 결과는 종종 변수 : YOUR=$(echo "${FILE}" | sed 's/my/your/')에 캡처됩니다. 당신은 단지 쉘 레시피 아니라 메이크업 컨텍스트에서 변수를해야하는 경우

+0

당신이 바로,하지만 그 경우 당신은 단지 "$ 파일" – tinySandy

+0

@BallPython'에코 "$ 파일"에코 사용할 수있는'메이크업 레시피에서 제대로 작동하지 않습니다. .. 당신이'$ f' 변수를 확장하고'echo'가' ile'이 될 것을 기대하지 않는다면 말입니다. –

0

당신은 노는 귀찮게 할 필요가 없습니다 eval (호이스트)이며 쉘 변수에 대신 할당 할 수 있습니다. 예를 들어

:

FILE = "myfile.txt" 

test : 
    YOUR='$(subst my,your,$(FILE))';\ 
    cat $(FILE) "$${YOUR}" 
관련 문제