【问题标题】:How to swap two files in a GNU make function?如何在 GNU make 函数中交换两个文件?
【发布时间】:2015-11-04 17:15:27
【问题描述】:

在我的 Makefile 中运行 uninstall 目标时,我想使用函数/宏交换两个文件。

这是我所拥有的,只留下一个文件并删除另外两个:

swap = mv $(1) $(3); mv $(2) $(1); mv $(3) $(2)

uninstall:
    @$(call swap,`printf "%s\n" $(FILE).* | sort -r | sed -n 1p`,\
      $(FILE),$(shell mktemp $(FILE).XXX))

【问题讨论】:

  • 您没有在任何地方运行 mktemp 命令。试试@set -x;$(call ....) 看看实际运行的是什么。这应该对你有帮助。
  • 从我的编辑器复制粘贴时出现本地错误。我正在尝试使用ticks$(shell ...)。我已经更新了示例。
  • 上面的函数确实有效,如果我只是$(call 1,2,3),问题出在mktemp某处。
  • $(shell) 是该位置的错误时间,但这与问题无关(它发生在配方扩展时而不是该配方行的运行时)。
  • 你可以做的另一件事是停止玩这个游戏,只使用一个你可以自动换出的符号链接。

标签: shell unix makefile gnu


【解决方案1】:

如果您知道要交换哪些文件,您可以尝试以下方法。我假设要交换的对是fooXXX, barXXX

define SWAP_files
swap_$(1):
    @temp=$$(shell mktemp temp.XXXXXX); \
    to_swap_with=$$(patsubst foo%,bar%,$(1)); \
    mv $(1) $$$$temp; \
    mv $$$$to_swap_with $(1); \
    mv $$$$temp $$$$to_swap_with

uninstall: swap_$(1)
endef

$(foreach foo,$(FOOS),$(eval $(call SWAP_files,$(foo))))

Foreach fooXXX 文件实例化一个规则:

swap_fooXXX:
    @temp=$(shell mktemp temp.XXXXXX); \
    to_swap_with=$(patsubst foo%,bar%,fooXXX); \
    mv fooXXX $$temp; \
    mv $$to_swap_with fooXXX; \
    mv $$temp $$to_swap_with

还有一条规则:

uninstall: swap_fooXXX

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多