【问题标题】:Is there a way to substitute \ with / for Gnu Make command goals?有没有办法用 / 代替 Gnu Make 命令目标?
【发布时间】:2011-03-21 08:57:32
【问题描述】:

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

> make foo/bar

它会运行良好。但是如果有人跑

> make foo\bar

它不会找到要构建的目标:

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

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

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

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

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

但这也行不通。解决这个问题的最佳方法是什么?

【问题讨论】:

  • 与其试图成为所有人的万事万物并使您的 Makefile 复杂化,不如教您的用户使用正斜杠。甚至 Windows 也能理解它们……

标签: windows makefile portability gnu-make


【解决方案1】:

我已经找到了一种相当不错的方法来处理这个问题,而无需借助脚本来包装 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 中用 $(call bstarget, $(DIRS)) 调用它

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 欢迎来到 Stack Overflow!虽然这可能是解决问题的一个有价值的提示,但一个好的答案也可以演示解决方案并解释其为什么有效。请edit 提供示例代码来说明您的意思。或者,考虑将其写为评论。
    猜你喜欢
    • 2016-06-10
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多