有没有办法用\替换\用于Gnu Make命令目标?

时间:2010-07-27 00:16:29

标签: windows makefile portability gnu-make

我正在使用正斜杠分隔路径组件,使用每个目录的目标在Windows上运行递归make。如果有人跑

> make foo/bar

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

> make foo\bar

它找不到要构建的目标:

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

如果我可以将这样的内容添加到我的顶级Makefile中,我会很高兴:

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

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

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

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

2 个答案:

答案 0 :(得分:2)

我已经想出了一个相当不错的方法来处理它,而不需要使用脚本来包装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))

答案 1 :(得分:0)

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