我正在使用一个Makefile,它接受一个命令行参数,在其上运行转换(tr
),然后使用该变量创建一个目录并打印结果。打印变量时,它是我所期望的(翻译名称),但是当使用该变量创建目录时,结果是不正确的。
例如,当我跑:
make build=debug
我明白了:
Building...
***************************
BuilD Type: Debug
Build Target: x86
但结果文件系统是:
out/
└─── debug | tr d D_x86
我想到在输入变量build
上运行translation并将其分配给$BUILD_TYPE
会将此新变量设置为"Debug"
但似乎并非总是如此......这实际上是如何运作的?
完整的Makefile:
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)
答案 0 :(得分:1)
这一行:
BUILD_TYPE='$(build) | tr d D'
没有运行shell命令。这是一个文字字符串赋值。
您要为变量BUILD_TYPE
分配文字字符串'debug | tr d D'
。
要执行您想要的操作,您需要实际运行shell命令。例如,像这样的东西。
BUILD_TYPE:=$(shell echo '$(build)' | tr d D)\
至于为什么你正确地看到事情""在输出行上,因为你碰巧在那里生成了一个有效的shell管道,而make正在运行它。
就是这一行
@echo 'Build Type: $(BUILD_TYPE)'
变为
@echo 'Build Type: 'debug | tr d D''
,您注意到,它是一个有效的shell行。另请注意,您打印的是BuilD type
而不是Build type
?