Autoconf:检查结构成员类型

时间:2018-09-12 13:35:37

标签: linux-kernel autoconf

我是 autoconf 的新手,所以我想问你如何检查 struct成员是否用特定类型声明。

例如,我应该检查 struct posix_acl.a_refcount 是否声明为 refcount_t ,而不是 atomic_t

我知道AC作为 ac_fn_c_check_decl ac_fn_c_check_member 起作用,但没有一个能完成此任务。

谢谢!

1 个答案:

答案 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.])

测试假定您已经有一个包含内核源目录的变量,并且在尝试测试之前,已在includeCPPFLAGS中指定了内核源的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/,可能导致上述编译测试失败。这可能无法达到我期望的方式,并且可能需要进行修改。