1

我有一个做很多这样的项目

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)
// do some legacy stuff
#else
// do current stuff
#endif

其中KERNEL_VERSION定义为

#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))

我想消除与当前版本无关的定义,但是像sunifdef不评估KERNEL_VERSION宏这样的工具,所以像

 sunifdef --replace -DKERNEL_VERSION\(a,b,c\)=\(\(\(a\)\<\<16\)+\(\(b\)\<\<8\)+\(c\)\) -DLINUX_VERSION_CODE=3.13.1 *

消息失败

sunifdef: 错误 0x04200: 参数“-DKERNEL_VERSION(a,b,c)=(((a)<<16)+((b)<<8)+(c)) 中有垃圾

我该如何解决这个问题?

4

3 回答 3

2

sunifdef 的继任者似乎是coan,并且以下命令似乎有效(在一个简单文件上):

coan source "-DLINUX_VERSION=KERNEL_VERSION(2,18,1)" \
            "-DKERNEL_VERSION(a,b,c)=((a)*0x10000 + (b)*0x100 + (c))" \
            testfile.c

我认为使用 KERNEL_VERSION 宏来定义 LINUX_VERSION 更漂亮,但您可能更喜欢 Chris Dodd 的十六进制版本。一个数字中的两个点肯定是行不通的。

于 2013-09-18T23:49:40.933 回答
2

正如您所演示的,使用sunifdef3.1.3,您无法做到这一点。您也不能使用早期版本(coan例如 4.2.2)来执行此操作。

但是,使用coan5.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不为假的条件在输出中存在。

于 2013-09-19T04:53:55.013 回答
0

该错误来自这样一个事实,即您无法在命令行上使用参数定义宏-D- 您只能定义简单的宏。但是,您不需要KERNEL_VERSION在命令行上定义,因为#define源代码中的应该没问题。您应该只需要
-DLINUX_VERSION_CODE=0x30d01- 您需要将其定义为单个整数常量(十六进制最简单)而不是带有点。

于 2013-09-18T22:49:24.923 回答