我正在开发一个 Makefile,它接受一个命令行参数,在其上运行翻译 ( tr
),然后使用该变量创建目录并打印结果。当打印变量时,它是我期望的(翻译名称),但是当使用变量创建目录时,结果不正确。
例如,当我运行时:
make build=debug
我明白了:
Building...
***************************
BuilD Type: Debug
Build Target: x86
但是生成的文件系统是:
out/
└─── debug | tr d D_x86
我认为运行translation在输入变量 build
上并将其分配给 $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)
最佳答案
这一行:
BUILD_TYPE='$(build) | tr d D'
没有运行 shell 命令。这是文字字符串赋值。
您正在为变量BUILD_TYPE
分配literal 字符串'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 行。另请注意,打印出的是 BuildD type
而不是 Build type
?
关于linux - 为什么我的 Makefile 变量在使用 tr 后不稳定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26869857/