【问题标题】:Substitutions in MakefileMakefile 中的替换
【发布时间】:2013-10-21 04:39:53
【问题描述】:
ifeq ($(SYSTEM),WINDOWS)
# need to change something here :
RM = @(if exist "$(subst /,\,$(DIRECTORY))" rmdir /s /q $(subst/,\,$(DIRECTORY))))
else
RM := @rm -rf
endif

clean_1 :
    $(RM) SOME/PATH/

clean_2 :
    $(RM) SOME/PATH/

如何将“SOME/PATH/”替换为“DIRECTORY”? 这是否可以在不改变代码结构的情况下实现?

附:我不能在不检查文件的情况下使用 rmdir,因为它会产生错误。

更新。我这样做了:

ifeq ($(SYSTEM),WINDOWS)
RM = @(if exist "$(subst /,\,$1)" rmdir /s /q $(subst/,\,$1)))
else
RM = @rm -rf $1
endif

clean_% :
    $(call RM, SOME/PATH/)

确实有效。感谢 Mark Galeck。

有没有办法通过替换 RM 变量而不更改 clean-target 命令来做到这一点?

【问题讨论】:

  • 你有什么理由想要这样做吗?
  • 无特殊原因。但我想知道,这可能吗?
  • 是的,我添加到我的答案中。是的,你想列出每个干净目标的目录 - 我没有意识到这一点是愚蠢的。

标签: makefile


【解决方案1】:

使RM 成为一个函数(有关如何执行此操作,请参阅手册)。

你会拥有

clean_%:
    $(call RM, SOME/PATH/)

是的,您也可以在不更改目标名称的情况下执行此操作,只需在原始规则中将 $(RM) 替换为函数调用即可。

实际上,我认为处理您似乎遇到的情况(从两个操作系统访问一个文件系统)的最佳方法是为分隔符引入一个变量

/ := $(if $(filter WINDOWS, $(SYSTEM)),\,/)

现在,您可以始终使用 SOME$/PATH,而无需更改任何其他内容 - 只需将 $ 放在 / 前面,您需要使路径也可用于 Windows

【讨论】:

    猜你喜欢
    • 2020-08-10
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多