2014-09-12 1 views
0

나는 여러 컴파일러로 다음과 같은 Makefile을 가지고, 나는 변수 CC를 통해 루프를 호출하고 싶습니다 : $으로메이크와 계산 된 변수 이름

cc_x64=x86_64-linux-gnu-gcc 
cc_mips=mips-linux-gnu-gcc 

all: 
    for arch in "x64" "mips" ; do\ 
    cc="cc_$$arch";\ 
    $($(cc)) some_file -o some_bin 

($ (CC)), 나는 $ (cc)를 cc_xxx로 대체하려고 시도하고, 실행하려고하는 실제 명령으로 대체하십시오. 이것은 GNU Make의 문서에서 계산 된 변수 이름이라고 불립니다. https://www.gnu.org/software/make/manual/html_node/Computed-Names.html

어떤 이유로이 기능을 사용할 수 없습니다. 내가 뭘 놓치고 있니?

답변

0

셸을 교차하거나 경계를 만들 수 없습니다. 쉘 컨텍스트에서 make 변수를 즉석에서 작성하고 평가하려고합니다. 그건 안돼.

모든 작업은 make 또는 쉘에서 수행해야합니다. 사람들은 쉘 변수를 확인하고이 같은 일을해야 내 보냅니다

all: 
    for arch in x64 mips; do\ 
    cc=cc_$$arch;\ 
    ${!cc} some_file -o some_bin.$$arch;\ 
    done 

그러나 아마 더하게 관용적 인 방법으로이 작업을 수행하는 것이 좋습니다 것입니다. (테스트되지 않은) 다음과 같이 보일 것이다

: 나는 루프를 사용하도록 강요 느꼈다 경우

all: $(addprefix some_file.,x86 mips) 

some_file.%: some_file 
     $(cc_$(*)) $^ -o [email protected] 
+0

'cc _ $ (*)'는 실제로는 cc_x86으로 평가되지만 '$ (cc _ $ (*))'는 빈 문자열로 대체됩니다. – Kereoz

+0

make의 버전은 무엇입니까? 빠른 테스트에서'$ (cc _ $ (*))'는 패턴 규칙을 위해 여기에서 작동합니다. 또한'x86'은 예제 아키텍처 목록에 없었습니다. 따라서 올바르게 작동하지 않는 make 변수 (cc_x86)가 없으면 (정확하게는 올바르게 작동하고 빈 문자열을 제공합니다) . –

+0

(x86은 그저 예일뿐입니다). 당신은 맞습니다. 더블 체크를 한 후에 패턴 규칙을 위해 여기에서 작동합니다. 나는 이전 테스트에서 뭔가를 망쳤습니다. 고맙습니다 ! – Kereoz

1

, 나는 이런 식으로 할 거라고 :

COMPS = x86_64-linux-gnu-gcc mips-linux-gnu-gcc 

all: 
    for comp in $(COMPS); do\ 
    $$comp some_file -o some_bin; \ 
    done 
+0

그래, 그게 다른 방법이야.하지만 여기서는 계산 된 변수 이름이이 특별한 경우에 작동하지 않는 이유를 이해하고 싶다. 나는 대체 솔루션을 찾지 않았다. 그래도 제안 주셔서 감사합니다. – Kereoz

0

귀하의 질문은 " 내가 뭘 놓치고 있니? " 대답은 Makefile이 쉘 스크립트와 다르게 작동한다는 것을 깨닫지 못한다는 것입니다. Makefile에 쉘 스크립트를 넣으려고합니다. 그것은 암소에 안장을 넣으려고하는 것과 같습니다. 너와 암소 모두 결과에 만족하지 않을 것이다.

당신이 그것을하려는 방식으로, 당신은 메이크업을 필요로하지 않습니다. "all :"아래에있는 쉘 스크립트를 사용하고 Make를 잊어 버리십시오. 왜 암소에 안장을 넣으려고합니까?

Make를 사용하는 방법을 배우고 싶다면, Make 매뉴얼을주의 깊게 읽고 특히 거기에 나와있는 예제를 공부하십시오. 그러면 쉘 스크립트와 Makefile의 차이점을 이해하게 될 것이고 모든 것이 더 명확해질 것입니다.

Makefile이 작동하도록 설계된 올바른 방법으로 원하는대로 수행하는 방법을 보여 드리겠습니다. 그러나 매뉴얼을 더주의 깊게 공부하십시오.

RESULTS := $(addprefix some_bin., x86_64 mips) 

.PHONY: all 
all: $(RESULTS) 
$(RESULTS): some_file Makefile 
    $(patsubst .%,%-linux-gnu-gcc,$(suffix [email protected])) $< -o [email protected]