cmake : 指定linux内核模块输出构建目录

Dmi*_*try 5 cmake kbuild

这是我的 cmake 来构建 linux 内核 hello world 模块。

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 )
Run Code Online (Sandbox Code Playgroud)

还有我的 Kbuild :

obj-m += drv.o
drv-objs := driver.o
Run Code Online (Sandbox Code Playgroud)

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

小智 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})
Run Code Online (Sandbox Code Playgroud)

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

  • 如果有人想使用 CLion,我发现为了阻止编辑器抱怨“MODULE_LICENSE”等,您需要在 CMakeLists 中的某个位置添加“add_definitions(-D__KERNEL__ -DMODULE)”。我还必须添加一个虚拟目标:``add_library(dummy_target hello.c)```,这样它就会首先解析源文件。 (4认同)

小智 0

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

COMMAND ${CMAKE_MAKE_PROGRAM} -C ${module_build_path} 
        M=${CMAKE_CURRENT_BINARY_DIR} src=${CMAKE_CURRENT_SOURCE_DIR}
Run Code Online (Sandbox Code Playgroud)