传递变量以在shell脚本中创建CFLAGS?

时间:2015-02-22 23:11:43

标签: bash shell makefile cflags

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

"-O1 -freorder-functions"

我正在尝试做类似

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

但我的所有尝试都会出现以下错误:

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的回声看起来不错。

1 个答案:

答案 0 :(得分:2)

如果文件中的标记周围有双引号,并且您正确地引用了shell变量,则make调用最终会被

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

也就是说,标志中有双引号。这一直传递给编译器调用,这意味着编译器调用类似于

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

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

要解决此问题,我会从文件中删除引号。您也可以opts=$line使用$line不加引号,但这并不完全安全。