2014-11-11 4 views
1

나는 커맨드 라인 매개 변수를 취하고 거기에 번역본 (tr)을 실행 한 다음, 그 변수를 사용하여 디렉토리를 만들고 그 결과를 인쇄하는 Makefile 작업을하고있다. 변수를 인쇄 할 때 예상대로 (변환 된 이름), 변수를 사용하여 디렉터리를 만들 때 결과가 올바르지 않습니다. 그래서 예를 들어tr을 사용한 후에 왜 Makefile 변수가 변하지 않습니까?

, 나는 실행하면

Building... 
*************************** 
BuilD Type:  Debug 
Build Target:  x86 

그러나 결과 파일 시스템은 다음과 같습니다 :

make build=debug 

내가 볼

out/ 
└─── debug | tr d D_x86 

내가 가 실행하는 생각 입력 변수 buildtranslation을 입력하고 $BUILD_TYPE에 서명하면이 새로운 변수가 "Debug"으로 설정되었을 것입니다. 그러나 항상 그런 것은 아닙니다. 실제로 어떻게 작동합니까?


전체 메이크 :

BUILD_TYPE=Release 
BUILD_TARGET=Arm 
OUTPUT_DIR=out 

MKDIR_P = mkdir -p 

ifeq ($(build),debug) 
    BUILD_TYPE='$(build) | tr d D' 
endif 
ifeq ($(target),x86) 
    BUILD_TARGET=$(target) 
endif 

TT=$(BUILD_TYPE)_$(BUILD_TARGET) 

all: directories 
    @echo 'Building...' 
    @echo '***************************' 
    @echo 'Build Type:  $(BUILD_TYPE)' 
    @echo 'Build Target:  $(BUILD_TARGET)' 
    @echo 'Output Directory: $(PWD)/$(OUTPUT_DIR)' 
    @echo '***************************' 

directories: 
    ${MKDIR_P} $(OUTPUT_DIR) 
    ${MKDIR_P} $(OUTPUT_DIR)/$(TT) 

답변

1

이 줄 :

BUILD_TYPE='$(build) | tr d D' 

쉘 명령을 실행하지 않습니다. 이것은 리터럴 문자열 할당입니다.

변수 BUILD_TYPE리터럴 문자열 'debug | tr d D'에 할당합니다.

쉘 명령을 실제로 실행하는 데 필요한 것을 수행하십시오. 예를 들면 이런 것. 당신이 유효한 쉘 파이프 라인을 생성 할 일이 그것을 실행하기 때문이다 출력 라인에 "제대로"일을보고있는 이유에

BUILD_TYPE:=$(shell echo '$(build)' | tr d D)\ 

. 이 라인을

@echo 'Build Type:  $(BUILD_TYPE)' 

입니다

당신이 알 수 있습니다,

@echo 'Build Type:  'debug | tr d D'' 

이되고, 유효한 쉘 라인입니다. 또한 BuilD type이 표시되고 Build type이 인쇄되지 않습니다.

+0

AH ... 확인. 그래서 출력이 올바른 이유는'@ echo'가 실행 중일 때 쉘 명령을'$ BUILD_TYPE' (즉'tr')에서 실행했기 때문입니다. – Mike

+0

@Mike Correct, 나는 그것을 설명하기 위해 편집했다. –

+0

감사합니다. 쉘 명령어로'$ BUILD_TYPE' 할당을 업데이트하면 BuilD 유형 "'에서 출력 디렉토리 이름과 대문자 'D'를 모두 확인할 수 있습니다. 그 잘못된 인쇄를 놓쳤습니다. – Mike