说明
:脚本的用法见执行 bash mod_new_makefile.sh --help
的结果
脚本内容如下
#!/usr/bin/env bash
#=================================================================
# CPSTR: Copyright (c) 2019 By Abodu, All Rights Reserved.
# FNAME: mod_new_makefile.sh
# AUTHR: abodu,abodu@qq.com
# CREAT: 2019-08-27 14:02:21
# ENCOD: UTF-8 Without BOM
# VERNO: 0.0.1
# LUPTS: 2019-08-27 15:05:51
#=================================================================
sf_newModuleMakefile() {
local mod_name= src_files=
while [ $# -ge 0 ]; do
case $1 in
-h | --help | help)
echo -e "\n $FUNCNAME [-m MOD_NAME] [-s] <SRC_FILES>\n"
return
;;
-s | --src-files)
shift
for x in $@; do
[ "X${x:0:1}" == "X-" ] && break
src_files="${src_files}$(basename $x)"
done
;;
-m | --mod-name)
shift
mod_name=$1
;;
*)
[ "X${1:0:1}" != "X-" ] && src_files="${src_files}$(basename $1) "
;;
esac
shift
[ $# -eq 0 ] && break
done
#check
[ "X" == "X${src_files%% }" ] && echo -e "\n<no src files to compile,skip!!!>\n" && return
local store_path=$(dirname $(realpath ${src_files%% *}))
if [ "X" == "X${mod_name%% }" ]; then
mod_name=$(basename $store_path)
fi
local rst_file=$store_path/Makefile
cat <<'EOF' >$rst_file
KVERS := $(shell uname -r)
#若定义了HC_KSD变量, 则以HC_KSD的取值替换默认的linux内核代码路径(/lib/modules/$(KVERS)/build)
KSRCDIR = /lib/modules/$(KVERS)/build
ifdef HC_KSD
KSRCDIR := $(HC_KSD)
endif
MAKE = make #代码默认不进行交叉编译
#若定义了HC_CC变量, 则使用【aarch64-linux-gnu-】交叉编译工具链交叉编译到arm64上
ifdef HC_CC
MAKE := make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64
endif
# WHAT_YOU_NEED_TO_CHANGED
#指定驱动模块的名字,注意:驱动模块的名字千万不能和本文件夹内的任何源文件同名!
MOD_NAME := hello
#指定驱动模块的所有依赖源文件
MOD_SRCS := hc_hello.c
#最终由XXX-objs链接生成$(MOD_NAME).o ,再生成$(MOD_NAME).ko
$(MOD_NAME)-objs := $(MOD_SRCS:.c=.o)
obj-m += $(MOD_NAME).o
# 模块编译额外FLAG, 放开后将以【完全不优化】模式编译模块
# EXTRA_CFLAGS = -g -O0
build: modules
modules clean:
$(MAKE) -C $(KSRCDIR) M=$(CURDIR) $@
help:
@echo -e '\n[HC_KSD=/path/to/kernel/srcdir HC_CC=1] make\n'
EOF
sed -i "/^MOD_NAME :=/ s,=.*,= ${mod_name},g" $rst_file
sed -i "/MOD_SRCS :=/ s,=.*,= ${src_files},g" $rst_file
}
case $0 in
*.sh) sf_newModuleMakefile $@ ;;
esac