1

My project follows the POSIX.1-2008 standard and I would like to ensure that the user's implementation conforms to this standard.

So far I've been using AC_DEFINE to define the _POSIX_C_SOURCE macro as specified in the POSIX standard.

AC_DEFINE([_POSIX_C_SOURCE], [200809L], [Define the POSIX version])

However, since this is a simple C preprocessor #define macro , it does nothing to prevent an implementation that isn't POSIX-compliant from compiling.

Does Autoconf offer a standard macro to check for the implementation's conformance to a specific POSIX standard?

4

2 回答 2

3

要可移植地检查用户的实现是否符合特定的 POSIX 标准,AC_EGREP_CPP请用于检查 的存在和值_POSIX_VERSION

AC_EGREP_CPP(posix_200809L_supported,
             [#define _POSIX_C_SOURCE 200809L
              #include <unistd.h>
              #ifdef _POSIX_VERSION
              #if _POSIX_VERSION == 200809L
              posix_200809L_supported
              #endif
              #endif
             ],
             [],
             [AC_MSG_FAILURE([*** Implementation must conform to the POSIX.1-2008 standard.])]
)

这是由于 POSIX 做出的几项保证而起作用的。


步骤1

我们首先设置_POSIX_C_SOURCE200809L.

#define _POSIX_C_SOURCE 200809L

POSIX.1-2008指出,当应用程序包含由POSIX.1-2008描述的标头时,并且当此功能测试宏 ( _POSIX_C_SOURCE) 定义为具有该值200809L时,则all symbols required by POSIX.1-2008 to appear when the header is included shall be made visible.


第2步

因此,当我们unistd.h在下一行中包含时, POSIX.1-2008要求出现的所有符号都将可见。unistd.h

#include <unistd.h>

由于_POSIX_VERSION需要出现在 中unistd.h,它现在也是可见的。


第 3 步

_POSIX_VERSIONPOSIX.1-2008标准要求将其设置200809L.

对于符合 POSIX.1-2008 的实现,该值应为 200809L。

所以我们现在要做的就是测试是否_POSIX_VERSION定义了,如果是,它是否设置为等于200809L.

#ifdef _POSIX_VERSION
#if _POSIX_VERSION == 200809L

检查是否_POSIX_VERSION已定义有助于我们确定在实现上是否支持任何POSIX标准。检查 的值_POSIX_VERSION有助于我们缩小是否支持特定版本的POSIX标准。

如果这两个条件都为真,那么实现几乎肯定支持POSIX.1-2008

于 2013-08-14T19:29:55.497 回答
2

这是一个依赖于负数组大小技巧的 autoconf 测试:

  AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
    [[#include <unistd.h>]],
    [[int n[(_POSIX_VERSION == 200809L) ? (-1) : (+1)];]])],
    AC_MSG_FAILURE([POSIX.1-2008 profile required]))

getconf如果软件仅在主机上构建,则使用很好。

ac_posix_version=`getconf _POSIX_VERSION`
if test $ac_posix_version -ne 200809 >/dev/null 2>&1
  AC_MSG_FAILURE([POSIX.1-2008 profile required])
fi

这可能有错误(未测试)。这显然在交叉编译中没有用。

于 2013-08-14T17:41:40.393 回答