2017-05-24 58 views
0

我想了解我正在处理的项目中的生成文件。它是用automake /自动工具,包含这个简单的规则:automake - 执行目标的源块中的目标文件夹

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不够了解。请询问是否需要任何附加信息。

问题是,我注意到在源文件夹中有解压目录可以防止解压目标文件夹中的压缩文件。例如,假设在源文件夹的结构如下:

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

作将只解压archive1.ez build文件夹中:

build/my-app/deps/archive1/ 

我想知道这是我的makefile文件中的错误或automake的一个特点。如果更晚,是否有任何解决方法或设置或变量可用来禁用它?

+0

在您提交的Makefile片段中没有特定于Autotools的内容。然而,他们确实依赖于GNU扩展来“制作”自己。 –

+0

但我猜想,我们可以假定Makefile整体包含支持源代码构建的Autotools标准工具。 –

回答

1

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

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

在你的情况,但是,直接导致了行为你描述:

  • 缺省目标依赖于./my-app/deps/archive2
  • 解决对构建目录名称不会产生一个有效的文件名
  • 在尝试构建该目标之前,make会查看VPATH中列出的目录,在您的示例中它将包含..或等效的
  • make发现.././my-app/deps/archive2这VPATH搜索中,并因此确定所指定的目标已经存在,而且并不需要建立

因此,您观察到的行为是正常的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中。

+0

谢谢。这就是我一直在寻找的。显然这并不像我描述的那样简单,因为项目会下降到执行嵌套makefile的子文件夹中,其中变量是相对于该子文件夹的,但我认为这足以让我从此处继续前进。 – Amiramix