78 lines
2.9 KiB
Bash
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 |