我正在使用正斜杠分隔path组件使用每个目录的目标在Windows上进行recursion制作。 如果有人跑
> make foo/bar
它会运行良好。 但是,如果有人跑
> make foo\bar
它不会findbuild立的目标:
make: Nothing to be done for `foo\bar'.
我会喜欢它,如果我可以添加这样的东西到我的顶级Makefile:
MAKECMDGOALS = $(subst \,/,$(MAKECMDGOALS))
但是这样的事情是行不通的。 MAKECMDGOALS只能被读取。 或者,即使我可以为我所有的常规目标制作反斜杠目标,例如:
$(DIRS): %: $(subst /,\,%)
但是这也是行不通的。 最好的方法是什么?
我已经想出了一个相当不错的方式来处理这个,而不是诉诸脚本来包装make:
# $(call bstarget, foo foo/bar baz frob/niz) # will result in the following targets being defined in place: # foo\bar: foo/bar # brob\niz: from/niz bstarget = $(eval \ $(foreach TARGET, $1, \ $(if $(findstring /, $(TARGET)), \ $(call bstargeteval, $(subst /,\,$(TARGET)), $(TARGET))))) define bstargeteval $1: $2 endef
然后它可以在我的Makefile中调用$(调用bstarget,$(DIRS))
我想你需要在你的subst表达式中使用4个反斜杠(转义)。