Files

78 lines
2.9 KiB
Bash

#!/bin/bash
# 1. 获取当前 dkms.conf 的绝对路径
DKMS_CONF_PATH="${BASH_SOURCE[0]}"
# 2. 获取真实的物理目录路径
DKMS_SRC_DIR="$(cd "$(dirname "$(readlink -f "${DKMS_CONF_PATH}")")" && pwd)"
# 3. 提取目录名
CURRENT_DIR=$(basename "${DKMS_SRC_DIR}")
# 4. 解析PACKAGE_NAME和PACKAGE_VERSION
PACKAGE_NAME=$(echo "${CURRENT_DIR}" | sed 's/-[0-9][0-9.]*$//')
PACKAGE_VERSION=$(echo "${CURRENT_DIR}" | sed 's/^.*-\([0-9][0-9.]*\)$/\1/')
if [ "$PACKAGE_NAME" = "$CURRENT_DIR" ] || [ -z "$PACKAGE_VERSION" ]; then
echo "错误: 目录名 '$CURRENT_DIR' 不符合 '<包名>-<版本号>' 格式" >&2
exit 1
fi
echo "提取结果: PACKAGE_NAME=$PACKAGE_NAME, PACKAGE_VERSION=$PACKAGE_VERSION" >&2
# 5. Makefile 路径校验
MAKEFILE_ABS_PATH="${DKMS_SRC_DIR}/Makefile"
if [ ! -f "${MAKEFILE_ABS_PATH}" ]; then
echo "错误: 在目录 ${DKMS_SRC_DIR} 下找不到 Makefile" >&2
exit 1
fi
# 6. 从 Makefile 中提取或推断驱动名称
DRIVER_NAME=$(grep -E '^[[:space:]]*DRIVER_NAME[[:space:]]*[:?]?=' "${MAKEFILE_ABS_PATH}" | head -1 | sed -E 's/^[^=]*=[[:space:]]*//' | sed 's/[[:space:]]*$//' | tr -d '"' | tr -d "'")
# 去掉 .ko 或 .o 后缀
DRIVER_NAME=$(echo "$DRIVER_NAME" | sed 's/\.ko$//' | sed 's/\.o$//')
if [ -z "$DRIVER_NAME" ] || [ "$DRIVER_NAME" = "Makefile" ]; then
echo "警告: Makefile 中未找到 DRIVER_NAME 定义,尝试从 obj-m 提取..." >&2
# 降级抓取 obj-m
DRIVER_NAME=$(grep -E '^obj-m[[:space:]]*[\+:]?=' "${MAKEFILE_ABS_PATH}" | head -1 | sed -E 's/^obj-m[[:space:]]*[\+:]?=[[:space:]]*//' | sed 's/[[:space:]]*$//' | tr -d '"' | tr -d "'")
# 去掉所有 .o 和 .ko
DRIVER_NAME=$(echo "$DRIVER_NAME" | sed 's/\.ko$//' | sed 's/\.o$//')
if [ -n "$DRIVER_NAME" ]; then
echo "从 obj-m 推断驱动名称: $DRIVER_NAME" >&2
else
echo "错误: 无法从 Makefile 中确定驱动名称" >&2
exit 1
fi
else
echo "从 Makefile 提取驱动名称: $DRIVER_NAME" >&2
fi
# 7. DKMS 标准配置参数定义
PACKAGE_NAME="${PACKAGE_NAME}"
PACKAGE_VERSION="${PACKAGE_VERSION}"
BUILT_MODULE_NAME[0]="${DRIVER_NAME}"
BUILT_MODULE_LOCATION[0]="."
DEST_MODULE_LOCATION[0]="/kernel/drivers/misc"
# 编译与清理命令定义
MAKE[0]="make -C ${kernel_source_dir} M=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build"
CLEAN="make -C ${kernel_source_dir} M=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build clean"
AUTOINSTALL="yes"
# # 输出最终配置信息
# echo "========================================" >&2
# echo "DKMS 最终配置:" >&2
# echo " PACKAGE_NAME: $PACKAGE_NAME" >&2
# echo " PACKAGE_VERSION: $PACKAGE_VERSION" >&2
# echo " BUILT_MODULE_NAME: ${BUILT_MODULE_NAME[0]}" >&2
# echo " BUILT_MODULE_LOCATION: ${BUILT_MODULE_LOCATION[0]}" >&2
# echo " DEST_MODULE_LOCATION: ${DEST_MODULE_LOCATION[0]}" >&2
# echo "========================================" >&2