【问题标题】:cmake : specify linux kernel module output build directorycmake : 指定 linux 内核模块输出构建目录
【发布时间】:2018-11-25 09:23:16
【问题描述】:

这是我构建 linux kernle hello world 模块的 cmake。

if ( UNIX )
    # Version number
    set ( DRV_MAJOR 1 )
    set ( DRV_MINOR 0 )
    set ( DRV_PATCH 0 )

    set ( DRV_VERSION ${DRV_MAJOR}.${DRV_MINOR}.${DRV_PATCH} )

    configure_file( drv_config.h.cmake ${CMAKE_CURRENT_SOURCE_DIR}/drv_config.h )
    execute_process(COMMAND uname -r
                    OUTPUT_VARIABLE os_version
                    OUTPUT_STRIP_TRAILING_WHITESPACE)

    set(module_path /lib/modules/${os_version})
    set(module_build_path ${module_path}/build)

    add_custom_command(OUTPUT drv.ko
                       COMMAND ${CMAKE_MAKE_PROGRAM} -C ${module_build_path} M=${CMAKE_CURRENT_SOURCE_DIR}
                       DEPENDS driver.c Kbuild
                       COMMENT "Building drv.ko"
                      )

    add_custom_target(drv ALL DEPENDS drv.ko)

endif( UNIX )

还有我的 Kbuild:

obj-m += drv.o
drv-objs := driver.o

如何为所有对象文件和相关内容指定输出目录?目前在源目录位置生成构建内容。而且我不想混合源文件和 obj 文件。有什么想法吗?

【问题讨论】:

  • 你读过CMake tutorial吗?
  • 是的,我有。内核模块什么都没有
  • 不过有configure_file左右。
  • 就我而言,configure_file 没有问题。我希望所有目标文件都存储在二进制文件而不是 src 中。是否可以不将其从源复制到 bin ?

标签: cmake kbuild


【解决方案1】:

上面的这个答案帮助了我,弄清楚了。如果有人好奇怎么做。

查看它并使用 gitlab: https://gitlab.com/christophacham/cmake-kernel-module

最终的cmake文件如下所示:

cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)

project(driver VERSION 0.1.0 LANGUAGES C)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)

# Find kernel headers
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
find_package(KernelHeaders REQUIRED)
include_directories(${KERNELHEADERS_INCLUDE_DIRS})

set(DRIVER_FILE hello.ko)
set(KBUILD_CMD ${CMAKE_MAKE_PROGRAM} -C ${KERNELHEADERS_DIR} modules M=${CMAKE_CURRENT_BINARY_DIR} src=${CMAKE_CURRENT_SOURCE_DIR})

# Generate the Kbuild file through cmake.
FILE(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/Kbuild "obj-m := hello.o")

add_custom_command(OUTPUT ${DRIVER_FILE}
        COMMAND ${KBUILD_CMD}
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
        DEPENDS hello.c VERBATIM)

add_custom_target(driver ALL DEPENDS ${DRIVER_FILE})

这与 FindKernelHeaders.cmake 一起允许我在构建文件夹中使用 cmake 构建内核模块。 它从来没有打算分享,但无论如何都做了,因为似乎对这个问题很感兴趣。

【讨论】:

  • 如果有人想使用 CLion,我发现要阻止编辑器抱怨 MODULE_LICENSE 等等,你需要在 CMakeLists.txt 的某处添加 add_definitions(-D__KERNEL__ -DMODULE) 我还必须添加一个虚拟目标:add_library(dummy_target hello.c),所以它会首先解析源文件。
  • 我必须修改 FindKernelHeaders.cmake 才能在 Ubuntu 上找到头文件。将第 11 行更改为 PATHS /usr/src/linux-headers-${KERNEL_RELEASE}(原为 PATHS /usr/src/kernels/${KERNEL_RELEASE}
  • 我添加了所有信息 + 为了满足我的需求而必须进行的更改到一个分叉的项目中。感谢 Christoph Acham 和 MerseyViking 的贡献和想法! gitlab.com/phip1611/cmake-kernel-module
【解决方案2】:

参考这个答案:https://stackoverflow.com/a/37858314 看来解决办法是:

COMMAND ${CMAKE_MAKE_PROGRAM} -C ${module_build_path} 
        M=${CMAKE_CURRENT_BINARY_DIR} src=${CMAKE_CURRENT_SOURCE_DIR}

【讨论】:

  • 谢谢,这几乎对我有用,但是 modpost 阶段给出了一个错误,说它找不到 ${CMAKE_CURRENT_BINARY_DIR}/Makefile
猜你喜欢
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 2013-09-20
  • 2011-02-23
  • 2012-08-28
相关资源
最近更新 更多