5

这是我构建 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 文件。有任何想法吗?

4

2 回答 2

8

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

看看它和 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 构建内核模块。它从来没有打算分享,但无论如何都做了,因为似乎对这个问题很感兴趣。

于 2019-12-04T11:18:41.753 回答
0

参考这个答案:https ://stackoverflow.com/a/37858314似乎一个解决方案是:

COMMAND ${CMAKE_MAKE_PROGRAM} -C ${module_build_path} 
        M=${CMAKE_CURRENT_BINARY_DIR} src=${CMAKE_CURRENT_SOURCE_DIR}
于 2019-04-23T18:27:40.970 回答