如何在 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
可以为空也可以不为空
假设我定义了一个 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
可以为空也可以不为空