2010-07-27 87 views
3

我正在windows上使用目标为每个目录运行正反斜杠以使用正斜杠分隔路径组件。如果有人跑有没有办法用Gnu Make命令目标替换//?

> make foo/bar 

它会正常运行。但是,如果有人运行

> make foo\bar 

就找不到目标,以构建:

make: Nothing to be done for `foo\bar'. 

我会喜欢它,如果我可以添加这样的事情我顶层的Makefile:

MAKECMDGOALS = $(subst \,/,$(MAKECMDGOALS)) 

但这样的事情不起作用。 MAKECMDGOALS只能被阅读。或者即使我可以为我所有的常规目标制作反斜杠目标,如下所示:

$(DIRS): %: $(subst /,\,%) 

但是这也行不通。最好的解决方法是什么?

+0

不要试图成为万能的人,而是让你的Makefile复杂化,教你的用户使用正斜杠。即使Windows了解他们... – Jens 2017-05-02 09:58:41

回答

1

我已经想通了处理这一个相当不错的方式,而不诉诸脚本来包装品牌:

# $(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) )

0

我认为你需要4个反斜杠(转义)在你的subst表达式中。

+3

欢迎来到堆栈溢出!虽然这可能是一个解决问题的有价值的提示,但一个好的答案也可以说明解决方案并解释*为什么它可以工作。请[编辑]提供示例代码来展示你的意思。或者,可以考虑将其写为注释。 – 2017-05-02 09:51:51