【发布时间】:2011-11-02 15:33:21
【问题描述】:
我想通过将环境变量CPU_TYPE 及其值-mcpu=603 作为命令行参数传递给该makefile 来调用makefile。我正在输入以下命令
make -f make_file CPU_TYPE=-mcpu=603
但它给出了错误,因为环境变量值具有= 符号。如何在环境值中转义这个等号。
注意:我不能在make_file 中添加这个环境变量或任何其他变量。我只需要将它作为命令行参数传递。
【问题讨论】:
我想通过将环境变量CPU_TYPE 及其值-mcpu=603 作为命令行参数传递给该makefile 来调用makefile。我正在输入以下命令
make -f make_file CPU_TYPE=-mcpu=603
但它给出了错误,因为环境变量值具有= 符号。如何在环境值中转义这个等号。
注意:我不能在make_file 中添加这个环境变量或任何其他变量。我只需要将它作为命令行参数传递。
【问题讨论】:
应该没有任何问题,但也许您正在与很少使用的 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 反对环境值中的“=”。如果有这样的限制,那就麻烦了。
但是,我能够做到:
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 系统上都能获得相同的结果。
【讨论】:
make 'CFLAGS=-Dxyz=pqr' 或 make CFLAGS\=-Dxyz\=pqr 具有使参数由 make 正常解释而不是由壳。 (至少在 Mac OS X 上使用 bash 3.2.48。)
我不确定是否有直接的方法可以实现您想要的。
但也许您可能会修改您的 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
【讨论】: