【问题标题】:What is the escape character for '=' symbol in GNU make?GNU make 中“=”符号的转义字符是什么?
【发布时间】:2011-11-02 15:33:21
【问题描述】:

我想通过将环境变量CPU_TYPE 及其值-mcpu=603 作为命令行参数传递给该makefile 来调用makefile。我正在输入以下命令

make -f make_file CPU_TYPE=-mcpu=603

但它给出了错误,因为环境变量值具有= 符号。如何在环境值中转义这个等号。

注意:我不能在make_file 中添加这个环境变量或任何其他变量。我只需要将它作为命令行参数传递。

【问题讨论】:

    标签: build makefile gnu


    【解决方案1】:

    不大可能

    应该没有任何问题,但也许您正在与很少使用的 shell 功能发生冲突。

    如果您在运行的 shell 中使用 set -k,或使用 sh -k 运行 shell,它会将任何看起来像环境变量的内容视为环境变量。

    您可能已经知道除了 C shell 系列之外的其他 shell 可以通过在命令之前添加单个命令来为单个命令设置环境变量:

    PATH="/somewhere/else:$PATH" cmdname -opts file1 file2
    

    命令本身看到修改后的环境; shell 对cmdname 的搜索没有改变。但是,在 set -k 生效后,任何看起来像环境变量的东西都会被视为一个:

    cmdname -opts PATH="/somewhere/else:$PATH" file1 file2
    

    例如,您可以使用env 作为命令来验证这一点。有充分的理由(例如 dd 命令)不将此设置为默认行为。

    反对假设

    反对这个假设,我不知道有一个 shell 反对环境值中的“=”。如果有这样的限制,那就麻烦了。

    普通的 GNU Make 是可以的

    但是,我能够做到:

    make CFLAGS='-Dxyz=pqr' progname
    

    而且,在set -k 生效的情况下,我也可以这样做:

    make -e CFLAGS='-Dxyz=pqr' progname
    

    在这两种情况下,编译都会采用通过命令行指定的值来覆盖在 makefile 中设置的值。

    make 看不到单引号;当然,它们会被外壳移除。你可以完全忽略它们,我得到相同的结果。我在 MacOS X 上使用 bash 运行,但我希望在任何使用任何标准 POSIX-ish shell(Bourne、Korn、Bash)的类 Unix 系统上都能获得相同的结果。

    【讨论】:

    • 您可以通过引用它来隐藏 sh -k 中的等号:make 'CFLAGS=-Dxyz=pqr'make CFLAGS\=-Dxyz\=pqr 具有使参数由 make 正常解释而不是由壳。 (至少在 Mac OS X 上使用 bash 3.2.48。)
    【解决方案2】:
    【解决方案3】:

    我不确定是否有直接的方法可以实现您想要的。

    但也许您可能会修改您的 Makefile 以便它设置 CPU_TYPE,例如读取文件。您可以输入您的make_file 类似

    CPU_TYPE=$(shell cat $(CPU_TYPE_FILE))
    

    然后使用例如创建一个文件my603.cputype

    echo '-mcpu=603' > my603.cputype
    

    最后运行 make as

    make -f make_file CPU_TYPE_FILE=my603.cputype
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      相关资源
      最近更新 更多