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}