如何在 makefile 中以受保护的方式对末尾带有 space 的字符串进行编码?

How to encode a string with a space at the end in a protected manner in a makefile?

假设我定义了一个 runners.mk 文件:

run=./
valgrind=valgrind --this --or --that-option 

并故意在 valgrind 行的末尾放置一个 space。


想法是以相同的方式使用任何“跑步者”:

valgrind-foo-bar-executable: foo-bar-executable
  $(valgrind)$<

run-foo-bar-executable: foo-bar-executable
  $(run)$<

这样我就可以最终将所有内容抽象为匹配的跑步者模式(一旦我获得更多示例)。

但是,这是一个 public 存储库,标准做法是清除行尾的所有空白。

为了执行此模式,最好在 valgrind 命令末尾放置某种受保护的空白。但是,在 makefile 中,引号按字面解释。

有什么方法可以保护 makefile 中的这个带后缀的空白吗?

您可以在 valgrind 行的末尾添加一个空变量以“保护”它之前的 space:

empty=
run=./
valgrind=valgrind --this --or --that-option $(empty)

现在 --that-option$(empty) 之间的 space 将清晰可见,不会作为尾随 space 删除。

您甚至不必为此创建变量。在 make 中,所有尾随的 space 都会自动保留。所以,只需添加评论就足够了:

valgrind = valgrind --this --or --that-option # Leave one blank space

但是,在我看来,这是一种自找麻烦的做法。没有理由不能像这样在食谱中包含 space:

run-it: foo-bar-executable
        $(valgrind) ./$<

那么valgrind可以为空也可以不为空