2013-03-15 2 views
0

나는 보이는 메이크있어 같은 :정의 변수는

gator: LIB=-lm 
gatorgpu : GPU=-DG 

.... 
STATIC= 
ifdef STATIC 
    $(info CPU static)  
endif 

하지만 내가하고 싶은 뭔가 같은 : 누군가 유형 $make gatorgpu STATIC=1 또는 $make gator STATIC=1 다음 그래서

gator: LIB=-lm 
gatorgpu : GPU=-DG 

.... 
STATIC= 
ifdef STATIC 
    ifdef GPU 
    $(info GPU static) 
    else 
    $(info CPU static) 
    endif 
endif 

대상 (이 경우 CPU 또는 GPU)에 따라 정적 라이브러리로 컴파일됩니다. 불행히도 STATIC이 읽히지 만 GPU 변수가 없기 때문에 항상 CPU static이됩니다. 그것을하는 우아한 방법 있는가? 당신의 설명에서

+0

누락 된 것은 목표 별 변수가 효과가 있다는 것입니다. 그러므로'ifdef'와 같은 전역 범위에서'GPU'를 테스트하는 것은 작동하지 않을 것입니다. 왜냐하면 나중에 make가'gatorgpu' 타겟을 빌드하기 전까지 정의되지 않았기 때문입니다. – MadScientist

+0

@MadScientist이 문제를 해결하기 위해 타겟 관련 변수를 사용할 수 없습니다. 하지만 대신 내가 무엇을 할 수 있을까? 타겟에 따라 변수를 정의하려면 어떻게해야합니까? – Manolete

+0

글쎄, 귀하의 질문은 우리에게 효과적으로 당신에게 효과적으로 조언 하기엔 너무 추상적입니다. makefile의 축소 버전을 만드는 것이 좋지만 모든 컨텍스트가 손실 될 때까지 잘라내지 않도록 조심해야합니다. 아마도 GPU 유형에 따라'$ (info ...)'를 실행하는 것 외에도 _something_을하고 싶을 것입니다. 뭔가가 무엇인지에 대해 더 많이 알지 못한다면 우리는 최선의 방법으로 조언을 해 줄 수는 없습니다. 뭔가 일할 때까지 해결책을 추측하는 것 이외에는 말이죠. 건배! – MadScientist

답변

1

대상 특정 변수는 이유에 따라 해당 조리법에서만 사용할 수 있습니다. 다른 타겟은 레서피에 동일한 변수의 다른 버전을 사용할 수 있습니다.

당신은 당신이 할 tyring하든 달성하기 위해 목표 특정 변수를 사용하기로 결정하는 경우,이 작업 것이지만 :

gator: export LIB := -lm 
gatorgpu : export GPU := -DG 
STATIC ?= 0 
ACTUAL ?= 0 

export STATIC 

ifeq ($(ACTUAL),1) 
ifeq ($(STATIC), 1) 
    ifneq ($(GPU),) 
     $(info GPU static) 
    else 
     $(info CPU static) 
    endif 
endif 
endif 

.gator: 
    @echo LIB=$(LIB) GPU=$(GPU) 

.gatorgpu: 
    @echo LIB=$(LIB) GPU=$(GPU) 

gator: 
    @$(MAKE) .gator ACTUAL=1 

gatorgpu: 
    @$(MAKE) .gatorgpu ACTUAL=1 

PHONY: .gator .gatorgpu gator gatorgpu 
  • 이것은 (목표 PER) 추가 메이크업을 호출의 오버 헤드가와 올바른 내 보낸 변수 세트
  • 내보내기는 make에서 실행되는 모든 하위 프로세스에 대해 변수가 설정되도록합니다. 훨씬 결과에 영향을주지 않지만

    $ make gatorgpu 
    make[1]: Entering directory `/home/ash/.scratch/make-test' 
    LIB= GPU=-DG 
    make[1]: Leaving directory `/home/ash/.scratch/make-test' 
    
    $ make gator 
    make[1]: Entering directory `/home/ash/.scratch/make-test' 
    LIB=-lm GPU= 
    make[1]: Leaving directory `/home/ash/.scratch/make-test' 
    
    $ make gatorgpu STATIC=1 
    GPU static 
    make[1]: Entering directory `/home/ash/.scratch/make-test' 
    LIB= GPU=-DG 
    make[1]: Leaving directory `/home/ash/.scratch/make-test' 
    
    $ make gator STATIC=1 
    CPU static 
    make[1]: Entering directory `/home/ash/.scratch/make-test' 
    LIB=-lm GPU= 
    make[1]: Leaving directory `/home/ash/.scratch/make-test' 
    

    사소한 수정의 몇 : :

  • 는 내가 보는 결과입니다 할당이 지정되지 않은 경우에만 할당됩니다. 따라서 make mytarget STATIC=1을 실행하면 변수 STATIC에 0이 할당되지 않습니다.
  • ifeqifneq 당신이 관심있는 특정 값에 대한 변수를 비교할 수있는보다 강력한 검사, ifdef 비교됩니다.
  • :=, 메이크업 불필요한 둔화를 방지하기 위해 정기적으로 = 선호한다 당신이하지 않는 실제로 recursively expanded variables이 필요합니다.

더 좋은 방법도-소위 거기 당신의 메이크에게 방금 STATIC

ifeq ($(STATIC), 1) 
gator: LIB := -lm 
gatorgpu : GPU := -DG 
else 
gator: LIB := <SOMETHING_ELSE_HERE> 
gatorgpu : GPU := <SOMETHING_ELSE_HERE> 
endif 

의 값에 따라 다른 대상 특정 변수 나 규칙을 정의하는 방식을 리팩토링하는 것 make가 호출 된 대상을 포함하는 $(MAKECMDGOALS)의 값을 확인하는 것과 관련된 권장 접근법.

ifeq ($(MAKECMDGOALS),gatorgpu) 
    GPU := -DG 
endif 
+0

@ Tuxdude 당신이 제안한 것을 시도했지만 GPU 변수가 Makefile이'ifeq' 섹션에 도달 할 때 아직 정의되지 않았습니다 ... – Manolete

+0

@Manolete - 답변을 업데이트 했으므로 초기 질문이 처음에는 분명하지 않습니다. :) – Tuxdude

+0

@ Tuxdude 나는'$ (MAKECMDGOALS)'접근법을 좋아한다. 왜 그렇지 않다고 생각하십니까? – Manolete

1

, 나는 다음과 같은 방법을 사용할 수 있습니다 말할 것입니다 : 당신은 정확히 명시되지 않은

ifdef STATIC 
gator: LIB:=-static -lstaticlib 
gatorgpu: GPU:=-DSTATICDEF 
else 
gator: LIB:=-lm 
gatorgpu: GPU:=-DG 
endif 

STATIC이 대를 정의 할 때 사용하려는 또는 경우에 변경 사항 옵션이없는 경우 정의되었으므로 몇 가지 예제 값을 만들었습니다.