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

Jer*_*wen 15 automake autoconf install autotools

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

dist_whatever_DATA=dir/subdir/filea ...
Run Code Online (Sandbox Code Playgroud)

但是当我的目录结构看起来像这样时会出现问题

*root
 *subdir
  *~10 files
 *subdir
  *~10 files
 *subdir
  *~700 files
 *subdir
 ...
 ~20 subdirs
Run Code Online (Sandbox Code Playgroud)

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

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

adl*_*adl 11

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

echo 'subdir_files =' > subfiles.mk
find subdir -type f -print | sed 's/^/  /;$q;s/$/ \\/' >> subfiles.mk
Run Code Online (Sandbox Code Playgroud)

然后subfiles.mk从你的主要包括这个Makefile.am:

include $(srcdir)/subfiles.mk
nobase_dist_pkgdata_DATA = $(subdir_files)
Run Code Online (Sandbox Code Playgroud)

第二种选择是EXTRA_DIST = subdir,然后编写自定义install-data-localuninstall-local规则.

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

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


pto*_*ato 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
Run Code Online (Sandbox Code Playgroud)

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

  • 三个小问题,与实际问题无关.我会替换`cat xxx | yyy | zzz` by`yyyy <xxx | zzz`简化操作系统的工作(如果你想在行的开头保留`xxx`,它也可以写成`<xxx yyy | zzz`).此外,您可以在详细模式下提取,以便同时创建清单(避免大型存档的两次解压缩).最后使用所有那些长选项(例如`rm --force`而不是`rm -f`)会使你的`Makefile`在GNU世界之外不可移植,而它可以轻松实现. (3认同)