cmake: указать выходной каталог сборки модуля ядра Linux

Вот мой cmake для сборки модуля linux kernle 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 )

И мой Kbuild:

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

Как я могу указать выходной каталог для всех объектных файлов и прочего? На данный момент материал сборки создается в месте расположения исходного каталога. И я бы не хотел смешивать исходные и obj файлы. Есть идеи?

0 ответов

Этот ответ выше помог мне разобраться. Если кому-то интересно как.

Проверьте это и 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 в папке сборки. Это никогда не предназначалось для распространения, но все равно было сделано, поскольку, похоже, в этом вопросе есть интерес.

Ссылаясь на этот ответ: /questions/12510068/sborka-modulya-yadra-linux-iz-dereva-v-otdelnom-obektnom-kataloge/12510076#12510076 кажется, что решение является:

COMMAND ${CMAKE_MAKE_PROGRAM} -C ${module_build_path} 
        M=${CMAKE_CURRENT_BINARY_DIR} src=${CMAKE_CURRENT_SOURCE_DIR}
Другие вопросы по тегам