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 有效),我们可以假设 Makefile
由 configure
使用 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 中。
我正在尝试了解我正在从事的项目中的联编文件。它使用 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 有效),我们可以假设 Makefile
由 configure
使用 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 中。