2013-08-15 2 views
1

합니다 메이크업을 릴리스 모든 부부에 대한 자료를 구축하기 위해GNU 내가 이동 프로젝트를위한 비교적 간단한 메이크가 나는 유사한 무언가 실행할 수 있도록하려면 간단하게 확장 변수와 자동 변수

다른 플랫폼 (예 : windows, linux, darwin).

내 메이크 파일은 현재 다음과 같습니다 : 나는 실제로 불구하고 구축 할 때

GOOSES = darwin windows linux 
GOARCHS = amd64 386 
.PHONY: release-all $(GOOSES) $(GOARCHS) 
release: $(GOOSES) 

$(GOOSES): GOOS := app [email protected] 
$(GOOSES): $(GOARCHS) 

$(GOARCHS): GOARCH := [email protected] 
$(GOARCHS): build 

build: 
GOOS=$(GOOS) GOARCH=$(GOARCH) go install ... 

, 내가 얻을 :

GOOS= GOARCH= go install ... 

지금까지 내가 :=을 말할 수있는 원인이되지 않는다 할당시 평가 될 [email protected]. 어떻게 든 달성 할 수 있습니까? 그렇지 않다면 모든 옵션을 구축 할 때까지 기본적으로 OS의 목록에있는 각 항목을 반복 한 다음 각 아키텍처를 반복합니다. 적어도 각 아키텍처/OS 콤보를 명시 적으로 지정하지 않아도 될까요?

+0

간단한 대답하면 자동 변수 (예 :'$ @ ') 전제 조건 목록에서 사용할 수없는 것입니다,하지만 ... 그것은이다 * 정말 *이 메이크 파일이 어떻게 작동하는지 예상 할 수 없다. 'GOOS = darwin GOARCH = 386 go install ... '과 같은 명령이 실제로 작동합니까? – Beta

+0

그래, "..."분명히 지금은 redacted지만, 잘 프로그램을 구축을 위해 잘 작동합니다. – simpleproof

답변

2

명령의 작품이,이 반복 처리 할 것을 가정 :

GOOSES = darwin windows linux 
GOARCHS = amd64 386 

build: 

define template 
build: build_$(1)_$(2) 
.PHONY: build_$(1)_$(2) 
build_$(1)_$(2): 
    GOOS=$(1) GOARCH=$(2) go install ... 
endef 

$(foreach GOARCH,$(GOARCHS),$(foreach GOOS,$(GOOSES),$(eval $(call template,$(GOOS),$(GOARCH))))) 
+0

대단히 고마워요. 매력처럼 작동합니다. '$ (1) _ $ (2)'구문/기능은 무엇입니까? 그래서 더 읽을 수 있습니다. – simpleproof

+0

@impleproof : [통조림 조리법] (http://www.gnu.org/software/make/manual/make.html#Canned-Recipes) 및 [호출 기능] (http : /www.gnu.org/software/make/manual/make.html#Call-Function). – Beta