正如您所演示的,使用sunifdef
3.1.3,您无法做到这一点。您也不能使用早期版本(coan
例如 4.2.2)来执行此操作。
但是,使用coan
5.2(当前版本),您几乎可以做您想做的事。
$ cat legacy.c
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)
do(some,legacy,stuff)
#else
do(current,stuff)
#endif
$ coan source -DLINUX_VERSION_CODE=0x020635 legacy.c
coan: /Users/jleffler/soq/legacy.c: line 1: warning 0x0041c: "-DKERNEL_VERSION(a,b,c)=(((a) << 16) + ((b) << 8) + (c))" has been assumed for the current file
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
do(current,stuff)
$ coan source -DLINUX_VERSION_CODE=0x020624 legacy.c
coan: /Users/jleffler/soq/legacy.c: line 1: warning 0x0041c: "-DKERNEL_VERSION(a,b,c)=(((a) << 16) + ((b) << 8) + (c))" has been assumed for the current file
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
do(some,legacy,stuff)
$
这接近你想要的,但并不完全。它提供“正确”的输出,但可能不是“有用的”输出。它为您提供了将为命令行上指定的代码编译的代码LINUX_VERSION_CODE
,而您可能希望基于LINUX_VERSION_CODE
并且KERNEL_VERSION
不为假的条件在输出中存在。