【问题标题】:Why are my Makefile variables inconstant after using tr?为什么使用 tr 后我的 Makefile 变量会变数?
【发布时间】:2014-11-11 16:38:28
【问题描述】:

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

【问题讨论】:

    标签: linux variables makefile tr


    【解决方案1】:

    这一行:

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

    没有运行 shell 命令。这是一个文字字符串赋值。

    您将 literal 字符串 'debug | tr d D' 分配给变量 BUILD_TYPE

    要做你想做的事,你需要实际运行一个 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

    【讨论】:

    • 啊...好的。所以输出看起来正确的原因是因为当@echo运行时,它在$BUILD_TYPE(即tr)中运行了shell命令?
    • 非常感谢,这解释了它,使用 shell 命令更新 $BUILD_TYPE 分配解决了输出目录名称和 "BuilD type" 中的大写“D”。我错过了错误的打印输出。
    • @Mike 我会指出,实际上没有理由为此使用$(shell),因为输入和输出都是已知的静态字符串。保存 shell、sub-shell 和 tr 调用,只使用 BUILD_TYPE=Debug 代替。 =)
    • 是的,在这种情况下,这是真的。这个 Makefile(/system) 很快就会变得更加复杂(你可以看到它现在甚至没有构建任何东西!)我正在考虑这个构造的其他应用程序,但我想我会测试它首先是简单的情况。
    猜你喜欢
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2019-01-17
    • 2019-08-11
    • 2014-11-20
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    相关资源
    最近更新 更多