在编译时是否有标识SunOS/Solaris版本的头文件?

Is there a header identifying SunOS/Solaris version at compile time?

本文关键字:版本 Solaris 文件 SunOS 编译 是否 标识      更新时间:2023-10-16

我试图在编译时检测Solaris/SunOS版本,以便我可以启用/禁用port_create()和其他api的使用。

在编译时是否有标识SunOS/Solaris版本的头文件?

如果没有头文件给你这个信息,你当然可以解析uname的输出,并从你的构建脚本/makefile/生成-D预处理器选项…

根据@ means -matters的建议,可以使用uname -r的输出创建编译时定义,例如SUN_VERSION。这实际上给出了一个浮点数,例如5.10,您可以使用一个简单的sed命令将其转换为与预处理器相当的形式,例如,这个编译器选项:

-DSUN_VERSION=`uname -r | sed -e 's/.([0-9]{1,1})$/01/' -e 's/.//'`

5.10生成510,为5.9生成509,等等。

在源程序中,可以这样使用

#if SUN_VERSION >= 510

识别操作系统版本以断言API是否可用是有风险的,如果不是注定要失败的话。你不能假设API会保留在未来的版本中,也不能假设它在并行分支中可用。Illumos和Solaris 11都报告SunOS 5.11作为他们的版本)。

克服这个问题的通常方法是简单地检查API是否可用,通过编译一个小的测试源代码来找出它。这通常是在一个传统上名为configure的脚本中完成的,该脚本构建一个Makefile和一个针对您的系统量身定制的包含文件。

要展开@ means -matters的答案,使用GNU make,并设置一个变量为操作系统版本。使用-D命令行选项将该变量传递给编译器。

Makefile:

OS_VERSION := $(shell uname -r)
version:
    $(CC) -DOS_VERSION=$(OS_VERSION) version.c -o version
test:
    echo $(OS_VERSION)

version.c:

#include <stdio.h>
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
int main()
{
    printf( "OS Version: " TOSTRING(OS_VERSION) "n" );
    return( 0 );
}
输出:

bash 4.1$ gmake test
echo 5.11
5.11
bash 4.1$ gmake version
cc -DOS_VERSION=5.11 version.c -o version
bash 4.1$ ./version
OS Version: 5.11
bash 4.1$

使用:=(如果没有设置则分配)只运行一次uname命令。

在Solaris 10中将显示"5.10",在Solaris 11中将显示"5.11"。