在 shell 脚本中传递变量以生成 CFLAGS?

Pass variable to make CFLAGS in shell script?

我正在尝试通过 shell 脚本使用 gnu make (4.1) 构建一些 c 程序。我想使用从文件中读取的不同 CFLAGS 参数。该文件包含如下行:

"-O1 -freorder-functions"

我正在尝试做类似

的事情
while read line
do
    opts="$line"
    make CFLAGS="$opts"
done < 

但我所有的尝试都以以下错误告终:

cc1: error: argument to ‘-O’ should be a non-negative integer, ‘g’, ‘s’ or ‘fast’

所以我尝试将文件的内容更改为仅在-O1 (-freorder-functions) 之后的参数,并在shell 脚本中添加-O1:

opts=$(printf "\"-O%d %s\"", 1, "$line")

(还有很多其他看起来不太明智的事情)但我仍然收到相同的错误消息。

在 shell 脚本中对参数进行硬编码工作正常:

make CFLAGS="-O1 -freorder-functions"

抱歉,如果这是一个愚蠢的问题,但我似乎无法找到任何此类操作的示例,而且我是 shell 脚本编写的新手,所以我真的不知道了解它如何处理此处的变量。我试图传递给 CFLAGS 的回声对我来说没问题。

在文件中的标志周围加上双引号,并且您尽职尽责地正确引用了您的 shell 变量,您的 make 调用最终成为

make CFLAGS="\"-O1 -freorder-functions\""

也就是flags里面加双引号。这一直传递到编译器调用,这意味着编译器调用类似于

cc "-O1 -freorder-functions" -c foo.c

...要求编译器使用优化级别 1 -freorder-functions,它抱怨说那是无效的。

为了解决这个问题,我将从文件中删除引号。您也可以将 opts=$line$line 不加引号一起使用,但这并不完全安全。