Linux 驱动根据LINUX_VERSION_CODE内核版本区分代码
实例代码:
#include <generated/uapi/linux/version.h>
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 60)
//LINUX kernel 小于5.10.60版本需要做的事情
#else
//LINUX kernel 大于等于5.10.60版本需要做的事情
#endif
分析实例代码
Linux内核Makfile部分分析
#include <generated/uapi/linux/version.h>
头文件是编译kernel 内核的时候自动生成的。咱们可以打开我们使用内核的顶层Makefile,简化代码如下所示(关键部分已经通过注释进行解释)
#内核的顶层Makefile中部分代码
#version_h 指定要生成的version.h的路径
version_h := include/generated/uapi/linux/version.h
old_version_h := include/linux/version.h
$(version_h): PATCHLEVEL := $(if $(PATCHLEVEL), $(PATCHLEVEL), 0)
$(version_h): SUBLEVEL := $(if $(SUBLEVEL), $(SUBLEVEL), 0)
$(version_h): FORCE
$(call filechk,version.h) #调用filechk函数生成version.h文件
$(Q)rm -f $(old_version_h)#删除老文件
filechk 函数
filechk 定义在Linux内核 scripts/Kbuild.include中(作者使用的linux kernel 5.10.144,其他版本的kernel 内核相差不大)
59 define filechk
60 $(Q)set -e; \
61 mkdir -p $(dir $@); \
62 trap "rm -f $(dot-target).tmp" EXIT; \
63 { $(filechk_$(1)); } > $(dot-target).tmp; \
64 if [ ! -r $@ ] || ! cmp -s $@ $(dot-target).tmp; then \
65 $(kecho) ' UPD $@'; \
66 mv -f $(dot-target).tmp $@; \
67 fi
68 endef
该函数其实分析的意义不大,大家只要知道是定成Makefile调用filechk函数生成version.h文件即可