问题描述
我需要将 -Werror 添加到已存在的(已导出?)CFLAGS 以进行构建。现在我只是想提取 CFLAGS 持有的数据。我是 Make 和 Makefiles 的新手,但必须添加一些预先存在的构建文件。
.PHONY: add_errors
add_errors:
@flags=$(CFLAGS);\
echo $$flags;\
但问题是,CFLAGS 是一个非常大的字符串,它设置了许多选项。 执行makefile时出现以下错误
/bin/sh: 1: -marm: not found
make[2]: *** [add_errors] Error 127
看起来像是将第一个空格作为字符串然后丢弃其余部分。
在CFLAGS里面,一段文字是
-march=armv5te -marm -mthumb-interwork -mtune=arm926ej-s --sysroot=/opt/dspg/v2.11-rc2/sysroots/cortexa9-neon-dspg-linux-gnueabi -Wno-psabi -ggdb -I/Opt/dspg/v2.11-rc2/sysroots/cortexa9-neon-dspg-linux-gnueabi/usr/include/libxml2
我能做什么?
解决方法
你应该问一个实际上与你真正想做的事情有某种关系的问题,包括代码的相关部分。你给出的这个例子对任何事情都没有用,所以我们给出的答案可能不会真正帮助你,但是:
我给你的第一个建议是永远不要在你的食谱中使用@前缀。或者至少在你的 makefile 已经 100% 正确工作之前不要使用它们。像这样抑制 make 的输出就像是蒙着眼睛试图调试一样。
问题根本与 make 无关,实际上:这只是 shell 引用规则。
如果您删除 @ 并查看打印的内容,您将看到它正在运行以下命令:
flags=-march=armv5te -marm -mthumb-interwork -mtune=arm926ej-s ...; echo $flags;
如果你把它剪切并粘贴到你的外壳上,你会得到完全相同的错误。
这是因为shell命令foo=bar biz baz
的意思是,将环境变量foo设置为值bar,然后运行命令biz与论据baz。
您需要添加引号,以便 shell 将所有参数放入 flags
变量中:
.PHONY: add_errors
add_errors:
@flags='$(CFLAGS)';\
echo $$flags;\
将导致 make 运行:
flags='-march=armv5te -marm -mthumb-interwork -mtune=arm926ej-s ...'; echo $flags;