【问题标题】:automake/gnu make dealing with directories in patterned rulesautomake/gnu make 在模式化规则中处理目录
【发布时间】:2012-03-07 12:20:13
【问题描述】:

当我创建模式化规则或其他一些自定义规则时,我需要能够处理不存在的目标目录。这适用于在源目录本身以外的目录中构建项目时。

例如:

%.out: %.in
   gen_file.sh $< > $@

问题是当有人在依赖项中指定路径时:

some_target: some/path/sample.out

这会失败,因为some/path 目录不存在。

有没有标准的方法来创建这个目录?

注意:我现在正在尝试使用 mkdir,但是在获取目录名而不是文件名时遇到了问题。可能只是一个逃避问题。更新:让它与@mkdir -p $(shell dirname $@) 一起工作这不太可能是可移植的。

【问题讨论】:

  • 您的 mkdir -p 解决方案对我来说看起来不错,除非您愿意解决根本原因(不要在不存在的目录中命名目标)。
  • 没有根本原因。我正在与应该支持的源目录不同的目录中构建。标准目标,如 "%.o: %.c" 也必须以某种方式创建目录。
  • 所以some_target: $(top_srcdir)/some/path/sample.out 不起作用?

标签: gnu-make automake


【解决方案1】:

automake 这样做的方式是让任何可能依赖于不存在的目录的东西都依赖于目标 some/dir/.dirstamp。以下模式规则应涵盖:

%/.dirstamp:
        mkdir -p $(@D)
        touch $@

还要注意使用$(@D) 来获取$@ 的目录部分。这意味着您不必使用$(shell dirname $@)(或GNU Make 内置$(dir $@))。请参阅the GNU Make manual 了解更多信息。

【讨论】:

  • 我真的可以使用这个规则吗?也就是说,我可以让某些东西依赖于some/path/.dirstamp,或者这更像是一个不保证存在的内部规则。 $(@D) 肯定有用。
  • 它不是 GNUmake 内置的,它是 automake 的实现细节。如果您正在手写您的 makefile,您可以自己定义它。如果您使用的是自动工具,您可以使用AC_CONFIG_COMMANDS 来确保所需的目录存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
相关资源
最近更新 更多