在Git中管理类似设备的内核驱动程序代码变体

时间:2014-10-13 17:15:33

标签: c git linux-kernel

我正在开发一个linux内核设备驱动程序,它可以处理几个几乎相同的设备,只有几个值定义差异。现在我只有一个include来定义这些值,这些值在构建内核时会被修改以匹配目标设备。每个设备的值永远不会改变,因此不断更改文件似乎效率低下。我已将驱动程序源包含为Git子模块,并考虑为每个设备创建单独的分支,但由于驱动程序仍处于活动开发状态,因此我将不断地将更改从主服务器合并到配置分支。我对C / driver / Git开发很陌生,所以也许有一些我完全不知道的东西。是否有更好的方法来管理多个稳定的配置变化以更改存储在Git仓库中的C代码?

1 个答案:

答案 0 :(得分:0)

我认为管理此问题的最佳方法称为conditional compilation,在您的情况下实施它将涉及两个步骤:

首先,确保您的设备特定详细信息完全从实际的驱动程序实现和单独的文件中抽象出来。听起来你已经有了这个,因为你说你只是在为一个#include语句改变它来编译不同的设备。太好了!

其次,为每个头文件向驱动程序添加#include,但将其与preprocessor conditional expressions分开。像这样:

#ifdef USING_FIRST_DEVICE
#include "first_device_details.h"

#elif defined(USING_SECOND_DEVICE)
#include "second_device_details.h"

#else
#include "some_default_device_details.h"

#endif

现在,要为不同的设备进行编译,您需要告诉编译器将其中一个宏视为“已定义”。我不是makefile或内核构建系统专家,所以你必须弄清楚如何将这个宏定义实际楔入你的makefile。 GCC编译器使用-D标志。例如,如果您没有构建内核模块,则可以像这样调用编译器:

  

gcc -D USING_SECOND_DEVICE mydriver.c -o outfile

这将编译mydriver.c,如果mydriver.c在其顶部有前面的代码片段,它将尝试包含“second_device_details.h”而不包含其他两个头文件。

我认为这种方法会让你感到满意,原因如下:

  1. 一切都可以在一个git分支上,没有文件冲突。
  2. 您可以在不更改任何文件的情况下为不同的设备进行编译。
  3. 如果您将设备详细信息从其他所有内容中抽象出来,则主线代码中的更改应适用于所有设备,而无需进行任何复制或分支合并。