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

时间:2014-11-11 16:38:28

标签: linux variables makefile tr

我正在使用一个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)

1 个答案:

答案 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