0

我需要将-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

我能做些什么?

4

1 回答 1

1

你应该问一个实际上与你真正想做的事情有关的问题,包括代码的相关部分。你给出的这个例子对任何事情都没有用,所以我们给出的答案可能实际上对你没有帮助,但是:

我给你的第一个建议是永远不要在你的食谱上使用@前缀。或者至少在你的 makefile 已经 100% 正确工作之前不要使用它们。像这样抑制 make 的输出就像在蒙眼时尝试调试一样。

这个问题根本与 make 无关,真的:它只是 shell 引用规则。

如果您删除@并查看 make 打印的内容,您会看到它正在运行以下命令:

flags=-march=armv5te -marm -mthumb-interwork -mtune=arm926ej-s ...; echo $flags;

如果您将其剪切并粘贴到您的外壳中,您将得到完全相同的错误

这是因为 shell 命令的foo=bar biz baz意思是,将环境变量foo设置为值bar然后运行带有参数baz的命令biz

您需要添加引号,以便 shell 将所有参数放入flags变量中:

.PHONY: add_errors
add_errors:
        @flags='$(CFLAGS)';\
        echo $$flags;\

将导致 make 运行:

flags='-march=armv5te -marm -mthumb-interwork -mtune=arm926ej-s ...'; echo $flags;
于 2021-01-28T17:53:15.673 回答