linux - 为什么我的 Makefile 变量在使用 tr 后不稳定?

标签 linux variables makefile tr

我正在开发一个 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/

相关文章:

Javascript 脚本返回错误

c - 具有自动依赖关系的 Makefile

Makefile:保存错误并在最后打印

linux - 为什么在使用 cmp 指令时会出现段错误?

linux - 分配给使用 gtk_drawing_area_new 创建的 gtk 窗口的颜色图错误

python - 分布式状态

c++ - 在 C++ 中声明变量与动态分配内存给变量?

Javascript:如何使变量 "private"仅用于当前递归层?

makefile - 在 automake 中生成生成的源列表(a la foreach)

linux - Apache Pig 进程在 Putty session 超时后被终止