我正在尝试从我正在进行的项目中理解makefile。它使用自动/自动工具,并包含以下简单规则:
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时,规则将基本上将位于my-app/deps/文件夹中的*.ez文件解压到build/my-app/deps/文件夹中。
我不知道这些信息是否足以解决我将要解释的问题,因为我对自动化/自动工具还不太了解。请询问是否需要更多的信息。
问题是,我注意到源文件夹中的解压缩目录阻止了make在目标文件夹中解压存档。例如,给定源文件夹中的下列结构:
my-app/deps/archive1.ez
my-app/deps/archive2.ez
my-app/deps/archive2/make将只解压构建文件夹中的archive1.ez:
build/my-app/deps/archive1/我想知道这是我的makefile中的一个bug,还是自动化的一个特性。如果是后者,是否有任何解决办法、设置或变量可用于禁用它?
发布于 2017-05-25 16:01:29
这主要是一个GNU make问题,并不是专门针对Autotools的。但是,由于目标系统的make具有GNU的风格(否则所有这些都不起作用),我们可以假设configure生成的Makefile使用GNU的VPATH特性作为其对源外(即.a)的支持的一部分。VPATH( VPATH)构建,如您正在执行的构建。
VPATH变量的值将被configure插入到Makefile中,用作搜索与构建目录相关的先决条件的路径。然而,关键是 used as a search path for rule 。这在一定程度上是有意义的,特别是对于作为其他规则先决条件的目标而言。
然而,在您的情况下,这直接导致您描述的行为:
./my-app/deps/archive2make将查找VPATH中列出的目录,在您的示例中,这些目录将包含..或等效的目录。make在此VPATH搜索中找到.././my-app/deps/archive2,因此确定指定的目标已经存在,不需要构建。因此,对于GNU make,您观察到的行为是正常的,假设Makefile是由自动生成的模板自动生成的。
是否有任何解决办法、设置或变量可用于禁用它?
你真的需要吗?如果存档文件已经在源树中解压缩,那么您可以期望make也通过VPATH找到它的内容。至少如果Makefile为源代码外的构建做好了充分的准备。
但是,如果您想确保在build目录中解压缩归档文件,那么可以显式地指定它。这应该可以做到:
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中。
https://stackoverflow.com/questions/44168940
复制相似问题