summaryrefslogtreecommitdiffstats
path: root/kernel/cmake/kernel.cmake
blob: dd45b1216ddec4ea48aad33f04fa7a2613fe753d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# SPDX-License-Identifier: GPL-2.0
#
# CMake macros to build and install Linux kernel modules
# Copyright (C) 2020 Manuel Bentele <development@manuel-bentele.de>
#

# macro to define target for preparing the Kbuild file
macro(add_kernel_build BUILD_SOURCE_TARGET BUILD_SOURCE_FILE)
    get_filename_component(BUILD_SOURCE_FILE_NAME ${BUILD_SOURCE_FILE} NAME)
    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BUILD_SOURCE_FILE_NAME}
                       COMMAND ${CMAKE_COMMAND}
                       ARGS -E copy ${BUILD_SOURCE_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${BUILD_SOURCE_FILE_NAME}
		               WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
		               DEPENDS ${BUILD_SOURCE_FILE}
		               VERBATIM)
    add_custom_target(${BUILD_SOURCE_TARGET} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${BUILD_SOURCE_FILE_NAME})
endmacro(add_kernel_build)

# macro to define kernel module targets
macro(add_kernel_module MODULE_NAME KERNEL_DIR MODULE_MACRO MODULE_SOURCE_FILES MODULE_HEADER_FILES BUILD_SOURCE_TARGET)
    # copy source files
    foreach(MODULE_SOURCE_FILE ${MODULE_SOURCE_FILES})
	    file(COPY ${MODULE_SOURCE_FILE} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
    endforeach()
    # copy header files
    foreach(MODULE_HEADER_FILE ${MODULE_HEADER_FILES})
        file(COPY ${MODULE_HEADER_FILE} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
    endforeach()
    # define build command
    set(MODULE_BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} ${MODULE_MACRO}
                                                   -C ${KERNEL_DIR}/build
                                                    M=${CMAKE_CURRENT_BINARY_DIR} modules
                                                    EXTRA_CFLAGS=${KERNEL_C_FLAGS})
    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_NAME}.ko
                       COMMAND ${MODULE_BUILD_COMMAND}
		               WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
		               DEPENDS ${MODULE_SOURCE_FILES} ${MODULE_HEADER_FILES} ${BUILD_SOURCE_TARGET}
		               VERBATIM)
    add_custom_target(${MODULE_NAME} ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_NAME}.ko ${ARGV6})
    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_NAME}.ko
            DESTINATION ${KERNEL_DIR}/extra
            PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
endmacro(add_kernel_module)