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が示したように、3.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)
$

これはあなたが望むものに近いですが、完全ではありません。「正しい」出力が得られますが、「役立つ」出力ではない可能性があります。コマンドラインで指定されたためにコンパイルされるコードを提供しますが、出力に残るために false ではないことに基づくLINUX_VERSION_CODE条件が必要になるでしょう。LINUX_VERSION_CODEKERNEL_VERSION

于 2013-09-19T04:53:55.013 に答える
0

エラーは、コマンドラインで引数を使用してマクロを定義できないという事実から発生してい-Dます。単純なマクロしか定義できません。ただし、ソースで問題ないはずなのでKERNEL_VERSION、コマンドラインで定義する必要はありません。#define必要
-DLINUX_VERSION_CODE=0x30d01なのは、ドットではなく単一の整数定数 (16 進数が最も簡単) として定義することだけです。

于 2013-09-18T22:49:24.923 に答える