automake - 源代码块中的目标文件夹执行目标

automake - target folder in source blocks executing destination

我正在尝试了解我正在从事的项目中的联编文件。它使用 automake/autotools 并包含这个简单的规则:

DEPS_SRC = $(shell cd $(srcdir); find . -name '*.ez')
DEPS = $(basename $(DEPS_SRC))
all : $(DEPS)

$(DEPS) : % : %.ez
  $(UNZIP) -o $<

假设目录结构是:

my-app/deps/
build/

当在 build 文件夹中执行 make my-app 时,该规则基本上会将 my-app/deps/ 文件夹中的 *.ez 文件解压到 build/my-app/deps/ 文件夹中。

我不知道这些信息是否足以解决我要解释的问题,因为我对 automake/autotools 了解不够。请询问是否需要任何其他信息。

问题是我注意到在源文件夹中有解压目录会阻止 make 在目标文件夹中解压存档。例如,给定源文件夹中的以下结构:

my-app/deps/archive1.ez
my-app/deps/archive2.ez
my-app/deps/archive2/

make 只会在构建文件夹中解压 archive1.ez

build/my-app/deps/archive1/

我想知道这是我的 makefile 中的错误还是 automake 的功能。如果是后者,是否有任何解决方法或设置或变量可用于禁用它?

这主要是一个 GNU make 问题,并非特定于 Autotools。但是,由于目标系统的 make 具有 GNU 风格(否则 none 有效),我们可以假设 Makefileconfigure 使用 GNU make 的 VPATH 功能作为其对源外 (a.k.a.VPATH) 构建的支持的一部分,例如您正在执行的构建。

configure 将插入到 Makefile 中的 VPATH 变量的值用作搜​​索路径,以搜索相对于构建目录找不到的先决条件。然而,关键是 it is also used as a search path for rule targets。这有一定的道理,特别是对于作为其他规则先决条件的目标。

但是,在您的情况下,这会直接导致您描述的行为:

  • 默认目标取决于./my-app/deps/archive2
  • 根据构建目录解析该名称不会生成有效的文件名
  • 在尝试构建该目标之前,make 查看 VPATH 中列出的目录,在您的示例中,该目录将包含 .. 或等效的
  • make在本次VPATH搜索中发现.././my-app/deps/archive2,因此判断指定的target已经存在,不需要构建

因此,假设 Makefile 是由 Autoconf 从 Automake 生成的模板构建的,您观察到的行为对于 GNU make 是正常的。

is there any workaround or setting or variable available to disable it?

你真的需要一个吗?如果存档文件已经在源代码树中解包,那么您可以期望 make 也可以通过 VPATH 找到它的内容。至少如果 Makefile 为外源构建做好了整体准备。

但是如果你想确保在构建目录中解压存档文件,那么你可以明确指定。应该这样做:

DEPS_SRC = $(shell cd $(srcdir); find . -name '*.ez')
DEPS = $(basename $(DEPS_SRC))
LOCAL_DEPS = $(addprefix $(abs_builddir)/,$(DEPS))
all : $(LOCAL_DEPS)

$(LOCAL_DEPS) : $(abs_builddir)/% : %.ez
  $(UNZIP) -o $<

在每个依赖项的名称前加上构建目录的绝对路径,并更新解压缩档案的规则以适应它。具有绝对路径的目标无法位于 VPATH 中。