我是 autoconf 的新手,所以我想问你如何检查 struct成员是否用特定类型声明。
例如,我应该检查 struct posix_acl.a_refcount 是否声明为 refcount_t ,而不是 atomic_t 。
我知道AC作为 ac_fn_c_check_decl 和 ac_fn_c_check_member 起作用,但没有一个能完成此任务。
谢谢!
答案 0 :(得分:1)
免责声明:由于在编写此答案时没有其他答案,因此这是我提供解决方案的最佳尝试,但您可能需要进行一些调整以使其适合您。告诫者。
您需要将AC_COMPILE_IFELSE
宏与使用atomic_t
的代码一起使用,如果编译成功,则您正在使用atomic_t
。作为将来的证明,如果refcount_t
测试失败,您可能还会为atomic_t
添加一个测试。
示例:
# _POSIX_ACL_REFCOUNT_T(type-to-check)
# ------------------------------------
# Checks whether the Linux kernel's `struct posix_acl'
# type uses `type-to-check' for its `a_refcount' member.
# Sets the shell variable `posix_acl_refcount_type' to
# `type-to-check' if that type is used, else the shell
# variable remains unset.
m4_define([_POSIX_ACL_REFCOUNT_T], [
AC_REQUIRE([AC_PROG_CC])
AC_MSG_CHECKING([whether struct posix_acl uses $1 for refcounts])
AC_COMPILE_IFELSE(
[AC_LANG_SOURCE(
[#include <uapi/../linux/posix_acl.h>
struct posix_acl acl;
$1 v = acl.a_refcount;]
)],
[AC_MSG_RESULT([yes])
AS_VAR_SET([posix_acl_refcount_type], [$1])],
[AC_MSG_RESULT([no])
)
])
_POSIX_ACL_REFCOUNT_T([atomic_t])
# If posix_acl_refcount_type isn't set, see if it works with refcount_t.
AS_VAR_SET_IF([posix_acl_refcount_type],
[],
[_POSIX_ACL_REFCOUNT_T([refcount_t])]
)
dnl
dnl Add future AS_VAR_SET_IF tests as shown above for the refcount type
dnl before the AS_VAR_SET_IF below, if necessary.
dnl
AS_VAR_SET_IF([posix_acl_refcount_type],
[],
[AC_MSG_FAILURE([struct posix_acl uses an unrecognized type for refcounts])]
)
AC_DEFINE([POSIX_ACL_REFCOUNT_T], [$posix_acl_refcount_type],
[The type used for the a_refcount member of the Linux kernel's posix_acl struct.])
测试假定您已经有一个包含内核源目录的变量,并且在尝试测试之前,已在include
或CPPFLAGS
中指定了内核源的CFLAGS
目录。您可以在指定的位置添加更多测试,如果在所有这些测试之后仍未定义生成的posix_acl_refcount_type
shell变量,则最终的AS_VAR_SET_IF
调用将调用AC_MSG_FAILURE
以停止{{ 1}},并显示指定的错误消息。
请注意,我使用configure
专门针对内核的<uapi/../linux/posix_acl.h>
标头,而不是安装在系统的include目录中的用户空间API linux/posix_acl.h
标头,其中uapi/linux/posix_acl.h
被剥离了,由于用户空间API中缺少uapi/
,可能导致上述编译测试失败。这可能无法达到我期望的方式,并且可能需要进行修改。