Makefile 自动生成-源块中的目标文件夹执行目标

Makefile 自动生成-源块中的目标文件夹执行目标,makefile,build,gnu-make,autotools,automake,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 $< 在build文件夹中执行make my app时,规则基本上将*.ez文件解包到my app/dep

我试图从我正在从事的一个项目中理解一个makefile。它使用automake/autotools并包含以下简单规则:

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

$(DEPS) : % : %.ez
  $(UNZIP) -o $<
build
文件夹中执行
make my app
时,规则基本上将
*.ez
文件解包到
my app/deps/
文件夹中

我不知道这些信息是否足以解决我将要解释的问题,因为我对汽车制造/自动工具了解不够。请询问是否需要其他信息

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

my-app/deps/archive1.ez
my-app/deps/archive2.ez
my-app/deps/archive2/
make将仅在build文件夹中解包
archive1.ez

build/my-app/deps/archive1/

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

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

VPATH
变量的值(该变量将插入
configure
Makefile
中)被用作相对于生成目录未找到的先决条件的搜索路径。然而,关键的一点是。这是有一定意义的,特别是对于作为其他规则先决条件的目标而言

然而,在您的案例中,这直接导致您描述的行为:

  • 默认目标取决于
    /my app/deps/archive2
  • 根据生成目录解析该名称不会生成有效的文件名
  • 在尝试构建该目标之前,
    make
    查看
    VPATH
    中列出的目录,在您的示例中,该目录将包含
    或等效目录
  • make
    在此VPATH搜索中查找
    。//my app/deps/archive2
    ,从而确定指定的目标已存在,不需要生成
因此,您观察到的GNU
make
行为是正常的,假设
Makefile
是由Autoconf从Automake生成的模板构建的

是否有任何解决方法或设置或变量可用于禁用它

你真的需要吗?如果存档文件已经在源代码树中解包,那么您也可以期望
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 $<
DEPS\u SRC=$(shell cd$(srcdir);find.-name'*.ez')
DEPS=$(basename$(DEPS_SRC))
本地_DEPS=$(addprefix$(abs_builddir)/,$(DEPS))
全部:$(本地部门)
$(本地部门):$(abs\u builddir)/%:%.ez
$(解压缩)-o$<

它在每个依赖项的名称前面加上构建目录的绝对路径,并更新用于解压缩归档文件的规则以适应它。具有绝对路径的目标,例如无法在VPATH中找到的目标。

在您提供的Makefile片段中,没有特定于自动工具的内容。不过,它们确实依赖GNU扩展来制作本身。不过,我想,我们可以假设Makefile总体上包含支持源代码外构建的Autotools标准工具。谢谢。这就是我要找的。显然,这并不像我描述的那么简单,因为项目会下降到执行嵌套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 $<