使用automake安装包含大量文件的数据目录树

时间:2011-06-18 09:41:32

标签: install autotools autoconf automake

我有一个数据目录,我想自动生成安装和卸载目标。基本上,我只想将这个目录逐字复制到DATA目录,通常,我可能会单独列出所有文件,例如

dist_whatever_DATA=dir/subdir/filea ...

但是当我的目录结构看起来像这样

时会出现问题
*root
 *subdir
  *~10 files
 *subdir
  *~10 files
 *subdir
  *~700 files
 *subdir
 ...
 ~20 subdirs

我只是无法列出作为Makefile.am的一部分包含的所有1000多个文件。那太荒谬了。

我也需要保留目录结构。我应该注意,这些数据在构建过程中根本不会生成,实际上是很短的录音。因此,我不希望automake“检查”我想要安装的每个文件是否已经实际创建,因为它们是否存在,并且无论文件是什么,我知道我希望它安装,等等文件不是,不应该安装。我知道这是其他地方不使用通配符instsalls的理由,但所有可能的原因都不适用于此。

3 个答案:

答案 0 :(得分:11)

我会使用脚本生成列出所有文件的Makefile片段:

echo 'subdir_files =' > subfiles.mk
find subdir -type f -print | sed 's/^/  /;$q;s/$/ \\/' >> subfiles.mk

然后在主subfiles.mk中加入Makefile.am

include $(srcdir)/subfiles.mk
nobase_dist_pkgdata_DATA = $(subdir_files)

第二个选项是EXTRA_DIST = subdir,然后编写自定义install-data-localuninstall-local规则。

这里的问题是EXTRA_DIST = subdir将分发subdir/中的所有文件,包括备份文件,配置文件(例如来自您的VCS),以及其他您不想分发的内容。

使用上述脚本可以过滤您真正想要分发的文件。

答案 1 :(得分:10)

我发现单独安装数百个文件会导致make install的长时间调用。我有一个类似的情况,我想安装数百个文件,保留目录结构,每次在集合中添加或删除文件时我都不想更改我的Makefile.am。

我在我的发行版中包含了LZMA文件存档,并制定了类似的自动规则:

GIANTARCHIVE = My_big_archive.tar.lz

dist_pkgdata_DATA = $(GIANTARCHIVE)

install-data-hook:
    cd $(DESTDIR)$(pkgdatadir); \
    cat $(GIANTARCHIVE) | unlzma | $(TAR) --list > uninstall_manifest.txt; \
    cat $(GIANTARCHIVE) | unlzma | $(TAR) --no-same-owner --extract; \
    rm --force $(GIANTARCHIVE); \
    cat uninstall_manifest.txt | sed --expression='s/^\|$$/"/g' | xargs chmod a=rX,u+w

uninstall-local:
    cd $(DESTDIR)$(pkgdatadir); \
    cat uninstall_manifest.txt | sed --expression='s/ /\\ /g' | xargs rm --force; \
    rm --force uninstall_manifest.txt

这样,automake会在My_big_archive.tar.lz目录中安装$(pkgdata),并在那里提取它,列出其中的所有文件,以便稍后卸载它们。这也比将每个文件列为安装目标要快得多,即使您要自动生成该列表。

答案 2 :(得分:3)

我会编写一个脚本(作为单独的shell脚本,或Makefile.am),作为install-data-hook目标的一部分运行。