【问题标题】:Pass variable to make CFLAGS in shell script?传递变量以在 shell 脚本中生成 CFLAGS?
【发布时间】:2015-02-22 23:11:42
【问题描述】:

我正在尝试通过 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 的回声看起来不错。

【问题讨论】:

    标签: bash shell makefile cflags


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 谢谢,这让我对可能发生的事情有所了解。但是,在第二种情况下,我从文件中删除了引号,因此 printf 中的 \" 。没有它们 - 在类似 $(printf "-O%d %s", 1, "$line") 的东西中 - 它对待-O 作为 printf 的一个选项。不幸的是,opts=$line 将“-freorder-fucntions”视为“-f”并查找名为“reorder-functions”的文件。
    • 使用$(printf -- "-O%d %s" 1 "$line")。按照惯例,选项处理在-- 之后停止。来自 GNU coreutils 的printf 遵循此约定。
    猜你喜欢
    • 2014-03-11
    • 2018-07-28
    • 2017-05-24
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    相关资源
    最近更新 更多