我有一个数据目录,我想自动生成安装和卸载目标。基本上,我只想将这个目录逐字复制到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的理由,但所有可能的原因都不适用于此。
答案 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-local
和uninstall-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
目标的一部分运行。