automake - 执行目标

时间:2017-05-24 21:42:51

标签: makefile build gnu-make autotools automake

我正在尝试从我正在处理的项目中理解makefile。它使用的是automake / autotools并包含这个简单的规则:

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

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

说目录结构是:

my-app/deps/
build/

make my-app文件夹中执行build时,规则基本上会将位于*.ez文件夹中的my-app/deps/个文件解压缩到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的一个功能。如果是后者,是否有可用的解决方法或设置或变量来禁用它?

1 个答案:

答案 0 :(得分:1)

这主要是一个GNU make问题,并不是特别针对Autotools。但是,由于目标系统的make具有GNU风格(否则 none ),我们可以假设Makefile生成的configure VPATH使用GNU make的VPATH功能作为其支持源外(又称VPATH)构建的一部分,例如您正在执行的构建。

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

然而,在您的情况下,这直接导致您描述的行为:

  • 默认目标取决于./my-app/deps/archive2
  • 针对构建目录解析该名称不会生成有效的文件名
  • 在尝试构建该目标之前,make查看VPATH中列出的目录,在您的示例中,这些目录将包含..或等效的
  • make在此VPATH搜索中找到.././my-app/deps/archive2,因此确定指定的目标已存在且不需要构建

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

  

是否有可用于禁用它的变通方法或设置或变量?

你真的需要吗?如果存档文件已在源树中解压缩,那么您可以期望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中找到。