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-local和uninstall-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)目录中,并在那里提取它,列出其中的所有文件,以便以后卸载它们.这也比将每个文件列为安装目标要快得多,即使您要自动生成该列表也是如此.