我正在准备我的BSD Make scripts的新版本,需要检查系统上的tar
命令是否支持使用-J
进行压缩的xz
选项。
在autoconf
中执行此操作的正确方法是什么? AC_CHECK_PROG
似乎不允许使用选项测试程序。
在我的情况下,有效的测试可能是tar -cJf /dev/null /dev/null
,所以我想出了测试
define([CHECK_TAR_OPTION], dnl
[printf 'checking whether tar -$1 works...']
[if tar c$1f /dev/null /dev/null >&- 2>&-;then $2=yes; else $2=no; fi]
[printf '%s\n' "$$2"])dnl
在我的代码中
CHECK_TAR_OPTION(z,USE_GZIP)
如果tar -z
有效,则将USE_GZIP设置为是,否则设置为否。
我对M4编程有一些经验,但与autoconf
没有关系,所以我希望有一个更特殊的解决方案。
答案 0 :(得分:3)
你的方法在我看来是错误的。你可以随时:
tar c /dev/null | <compression command> > foo.tar.<compression extension>
无论tar
支持什么,使用AC_CHECK_PROG
或其他任何内容都很容易。对你来说重要的是tar
可以提取,你没有测试。此代码介绍了您的压缩方法,并应根据通过tar
往返数据的能力选择一种方法。
compressor_test ()
{
AS_CASE(["$1"], [*xz], [tflag="J"], [*bzip2], [tflag="j"], [*gzip], [tflag="z"], [tflag=""])
tar c /dev/null > /dev/null 2>&1 | "$1" | tar "tv${tflag}" > /dev/null 2>&1
test $? -eq 0
}
AC_CACHE_CHECK([for a suitable tar compressor], [ac_cv_path_COMPRESSOR],
[AC_PATH_PROGS_FEATURE_CHECK([COMPRESSOR], [xz bzip2 gzip cat],
[[compressor_test $ac_path_COMPRESSOR \
&& ac_cv_path_COMPRESSOR=$ac_path_COMPRESSOR ac_path_COMPRESSOR_found=:]])])
AC_SUBST([COMPRESSOR], [$ac_cv_path_COMPRESSOR])