【问题标题】:How to pass make flags stored in text files in command line?如何在命令行中传递存储在文本文件中的make标志?
【发布时间】:2019-02-23 21:45:28
【问题描述】:

我有一个名为 OPTIONS.txt 的文本文件,其中存储了 Makefile 的所有标志:

arg1=foo arg2="-foo -bar"

我想将此文件中的所有标志传递给make。然而,

make `cat OPTIONS.txt`

make: invalid option -- 'a' 失败。似乎shell将其解释为:

make arg1=foo arg2="-foo -bar"
     ^argv[1] ^argv[2]   ^argv[3]

有没有办法让它解释为:

make arg1=foo arg2="-foo -bar"
     ^argv[1] ^--------argv[2]

【问题讨论】:

  • 一个肮脏的解决方法:bash -c "make $(cat OPTIONS.txt)"
  • OPTIONS.txt的格式你控制吗?
  • @glennjackman 是的

标签: shell gnu-make


【解决方案1】:

由于您控制选项文件,因此每行存储一个选项:

arg1=foo
arg2="-foo -bar"

然后在 shell 中,将文件读入一个数组,每行一个元素:

readarray -t opts < OPTIONS.txt

现在您可以调用 make 并保持选项完整:

make "${opts[@]}"

【讨论】:

  • 可能不 工作,因为它会将 arg2 的双引号作为文字字符传递。如果 make 抱怨,请存储不带引号的行:arg2=-foo -bar
  • 请注意,当您在这里说“外壳”时,您的意思是 bash。这不适用于其他 POSIX shell,因为它使用特定于 bash 的功能。
【解决方案2】:

如果你想让shell在反引号展开后解释引号,你需要使用eval,像这样:

eval make `cat OPTIONS.txt`

但是请注意,这会评估所有内容,因此如果您在反引号之外引用了内容,您将遇到同样的问题:

eval make `cat OPTIONS.txt` arg4="one two"

会报错。您必须双引号 arg4,如下所示:

eval make `cat OPTIONS.txt` arg4='"one two"'

一般来说,在脚本之外从命令行执行这样的事情是很棘手的。

预计到达时间

这里真正的问题是我们没有一套要求。 为什么你想把这些放到一个文件中,以及什么你要添加什么样的东西;它们只是 makefile 变量赋值,还是这里还有其他 make 选项,例如 -k 或类似的?

如果 OP 控制(可以更改)文件的格式并且文件包含仅由 make 使用的内容并且 OP 不关心变量是命令行分配还是常规分配并且只有变量分配和不是其他选项,那么他们可以只 (a) 将每个变量赋值放在自己的行上,(b) 删除所有引号,以及 (c) 从 makefile 中使用 include OPTIONS.txt 来“导入”它们。

【讨论】:

  • 看起来$(file &lt; filename.txt) 非常不受欢迎 - 是否有理由不使用它,因为某些(对我而言)未知的警告?
  • 我不知道该语法应该做什么。你的意思是$(&lt; filename.txt)?这对解决问题有什么帮助?它本身没有任何问题,除了它不能移植到 bash 以外的其他 shell,所以我不会在脚本或 makefile 中使用它,但如果你愿意,可以在 shell 提示符下使用它。但是,它与上面的cat 版本存在完全相同的问题。
  • 我指的是the file function inside GNUmake。我认为这是合适的,因为这个问题被标记为“gnu-make”。这个函数具有保留换行符的迷人特性,至少在我的make 版本中是这样。当然,这只适用于可变内容,而不适用于其他标志。但看起来这是 OP 的真正意图。
  • 哦,我明白了。但是 OP 想要从文件中读取变量赋值并将它们添加到 make 的命令行中。使用 make 的 file 函数来重现此行为将非常困难。首先,您需要使用eval 或类似方法将文件的变量赋值转换为进行变量赋值。其次,命令行上的变量优先于 makefile 中的变量,因此如果需要,您需要添加 override,这将非常棘手。第三,该文件包含 OP 希望 shell 删除的引号:在 make 中删除它们将非常困难。
猜你喜欢
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
相关资源
最近更新 更多