Linux kernel Autoconf:检查结构成员类型

Linux kernel Autoconf:检查结构成员类型,linux-kernel,autoconf,Linux Kernel,Autoconf,我是autoconf新手,因此我想问您如何检查结构成员是否声明为特定类型 例如,我应该检查struct posix\u acl.a\u refcount是否声明为refcount\u t而不是atomic\u t 我知道AC的职能是AC_fn_c_check_decl和AC_fn_c_check_成员,但没有一个能完成这项任务 谢谢大家! 免责声明:由于在撰写此答案时没有其他答案,因此这代表了我提供解决方案的最佳尝试,但您可能需要调整内容以使其适合您。警告买主 您需要将AC\u COMPILE\

我是autoconf新手,因此我想问您如何检查结构成员是否声明为特定类型

例如,我应该检查struct posix\u acl.a\u refcount是否声明为refcount\u t而不是atomic\u t

我知道AC的职能是AC_fn_c_check_decl和AC_fn_c_check_成员,但没有一个能完成这项任务

谢谢大家!

免责声明:由于在撰写此答案时没有其他答案,因此这代表了我提供解决方案的最佳尝试,但您可能需要调整内容以使其适合您。警告买主

您需要将
AC\u COMPILE\u if else
宏与使用
atomic\u t
的代码一起使用,如果编译成功,则使用的是
atomic\u t
。作为将来的证明,如果
原子测试失败,您还可以为
refcount\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.])
##(输入以检查)
# ------------------------------------
#检查Linux内核的'struct posix_acl'
#类型使用'type to check'作为其'a_refcount'成员。
#将shell变量“posix\u acl\u refcount\u type”设置为
#'type to check'如果使用了该类型,则返回shell
#变量保持未设置状态。
m4_定义([[u POSIX_ACL_REFCOUNT\u T][
AC_要求([AC_进度CC])
AC_MSG_检查([结构posix_acl是否使用$1进行引用计数])
如果需要,请进行编译(
[AC_LANG_来源(
[#包括
结构posix_acl acl;
$1 v=acl.a_refcount;]
)],
[AC_MSG_结果([是])
作为变量集([posix\u acl\u refcount\u type],$1]),
[AC_MSG_结果([no])
)
])
_POSIX_ACL_REFCOUNT_T([原子])
#如果未设置posix_acl_refcount_type,请查看它是否与refcount_t一起工作。
AS_VAR_SET_IF([posix_acl_refcount_type],
[],
[[u POSIX\u ACL\u REFCOUNT\u T([REFCOUNT\u T])]
)
dnl
dnl添加未来AS_VAR_SET_IF测试,如上所示,用于refcount类型
如有必要,在AS_VAR_SET_之前的dnl(如以下)。
dnl
AS_VAR_SET_IF([posix_acl_refcount_type],
[],
[AC_MSG_FAILURE([struct posix_acl使用无法识别的引用计数类型])
)
AC_定义([POSIX_ACL_REFCOUNT_T],$POSIX_ACL_REFCOUNT_type],
[用于Linux内核posix_acl结构的a_refcount成员的类型。]
测试假设您已经有一个包含内核源目录的变量,并且在尝试测试之前,在
cppfagas
CFLAGS
中指定了内核源的
include
目录。您可以在指定的位置添加更多测试,如果生成的
posix\u acl\u refcount\u type
s在所有这些测试之后,仍然没有定义hell变量,那么最后的
AS_VAR_SET_IF
调用将调用
AC_MSG_FAILURE
以停止
配置
,并显示指定的错误消息

请注意,我使用
专门针对内核的
linux/posix_acl.h
头,而不是安装在系统的include目录中的用户空间API
uapi/linux/posix_acl.h
头,去掉了
uapi/
,这可能会由于缺少
结构而导致上述编译测试失败用户空间API中的posix_acl
。这可能无法按我预期的方式工作,可能需要修改