From bd4b58ac435c8e0660a51df332d3efe9182b653e Mon Sep 17 00:00:00 2001 From: Liuguowei <1369375419@qq.com> Date: Tue, 22 Aug 2023 10:02:09 +0800 Subject: [PATCH] Add cmake for kernel module build --- qtfs/CMakeLists.txt | 16 +++++--- qtfs/README.md | 2 +- qtfs/qtfs/CMakeLists.txt | 70 +++++++++++++++++++++++++++++++++ qtfs/qtfs_server/CMakeLists.txt | 65 ++++++++++++++++++++++++++++++ 4 files changed, 147 insertions(+), 6 deletions(-) create mode 100644 qtfs/qtfs/CMakeLists.txt create mode 100644 qtfs/qtfs_server/CMakeLists.txt diff --git a/qtfs/CMakeLists.txt b/qtfs/CMakeLists.txt index d5b65ec..ed30fdc 100644 --- a/qtfs/CMakeLists.txt +++ b/qtfs/CMakeLists.txt @@ -23,12 +23,18 @@ target_include_directories(engine PRIVATE include/ ./ ipc/ /usr/include/glib-2.0 target_link_libraries(engine PRIVATE glib-2.0 pthread) target_compile_options(engine PRIVATE "-DQTFS_SERVER") -if(DEFINED UDS_TEST_MODE OR DEFINED QTFS_TEST_MODE) -target_compile_options(engine PRIVATE "-DUDS_TEST_MODE") -target_compile_options(udsproxyd PRIVATE "-DUDS_TEST_MODE") -message(WARNING "Important risk warning: the test mode is turned on, and qtfs will expose the network port, \ +if (DEFINED UDS_TEST_MODE OR DEFINED QTFS_TEST_MODE) + target_compile_options(engine PRIVATE "-DUDS_TEST_MODE") + target_compile_options(udsproxyd PRIVATE "-DUDS_TEST_MODE") + message(WARNING "Important risk warning: the test mode is turned on, and qtfs will expose the network port, \ which will bring security risks and is only for testing! If you do not understand the risks,\ please don't use or compile again without test mode macro!") -endif() +endif () + +# Build Kernel Module +set(QTFS_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +add_subdirectory(qtfs_server qtfs_server-km) +add_subdirectory(qtfs qtfs-km) + set(ignoreMe "${QTFS_TEST_MODE}${UDS_TEST_MODE}") \ No newline at end of file diff --git a/qtfs/README.md b/qtfs/README.md index dbf400e..5f0907f 100644 --- a/qtfs/README.md +++ b/qtfs/README.md @@ -49,7 +49,7 @@ qtfs的特性: ``` 2. 要求内核版本在5.10或更高版本。 - 3. 安装内核开发包:yum install kernel-devel。 + 3. 安装内核开发包:yum install kernel-devel json-c-devel。 服务端安装: diff --git a/qtfs/qtfs/CMakeLists.txt b/qtfs/qtfs/CMakeLists.txt new file mode 100644 index 0000000..5444fab --- /dev/null +++ b/qtfs/qtfs/CMakeLists.txt @@ -0,0 +1,70 @@ +# Build Kernel modules +set(MODULE_NAME qtfs) + +## First, find the kernel build directory +execute_process( + COMMAND uname -r + OUTPUT_VARIABLE KERNEL_RELEASE + OUTPUT_STRIP_TRAILING_WHITESPACE) +set(KBUILD_DIR /lib/modules/${KERNEL_RELEASE}/build/) +find_file(KERNEL_MAKEFILE NAMES Makefile PATHS ${KBUILD_DIR} NO_DEFAULT_PATH) +if (NOT KERNEL_MAKEFILE) + message(FATAL_ERROR "There is no Makefile in ${KBUILD_DIR}!") +endif () + +## Second, gather the source files +set(COMM_SRC_FILES + ${QTFS_BASE_DIR}/qtfs_common/conn.c + ${QTFS_BASE_DIR}/qtfs_common/misc.c + ${QTFS_BASE_DIR}/qtfs_common/qtfs_check.c + ${QTFS_BASE_DIR}/qtfs_common/socket.c + ${QTFS_BASE_DIR}/qtfs_common/symbol_wrapper.c) + +set(QTFS_SRC_FILES + ${QTFS_BASE_DIR}/qtfs/miss.c + ${QTFS_BASE_DIR}/qtfs/proc.c + ${QTFS_BASE_DIR}/qtfs/qtfs-mod.c + ${QTFS_BASE_DIR}/qtfs/sb.c + ${QTFS_BASE_DIR}/qtfs/syscall.c + ${QTFS_BASE_DIR}/qtfs/xattr.c) + +set(QTFS_MODULE_SRC ${COMM_SRC_FILES} ${QTFS_SRC_FILES} ${QTFS_BASE_DIR}/utils/utils.c) + +## Third, make the src files accessible to the kernel Makefile +set(MODULE_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/) +set(QTFS_KBUILD_FILE "obj-m := ${MODULE_NAME}.o") +foreach (file ${QTFS_MODULE_SRC}) + file(RELATIVE_PATH file "${CMAKE_CURRENT_SOURCE_DIR}" "${file}") + configure_file(${file} ${file} COPYONLY) + string(REPLACE ".c" ".o" file_obj "${file}") + set(QTFS_KBUILD_FILE "${QTFS_KBUILD_FILE}\n${MODULE_NAME}-y += ${file_obj}") +endforeach () + +set(QTFS_KBUILD_FILE "${QTFS_KBUILD_FILE}\nccflags-y += -I${QTFS_BASE_DIR}/include") +set(QTFS_KBUILD_FILE "${QTFS_KBUILD_FILE}\nccflags-y += -I${QTFS_BASE_DIR}/ipc") +set(QTFS_KBUILD_FILE "${QTFS_KBUILD_FILE}\nccflags-y += -I${QTFS_BASE_DIR}/qtfs") +set(QTFS_KBUILD_FILE "${QTFS_KBUILD_FILE}\nccflags-y += -I${QTFS_BASE_DIR}/utils") +set(QTFS_KBUILD_FILE "${QTFS_KBUILD_FILE}\nccflags-y += -DQTFS_CLIENT") + +if (DEFINED UDS_TEST_MODE OR DEFINED QTFS_TEST_MODE) + set(QTFS_KBUILD_FILE "${QTFS_KBUILD_FILE}\nccflags-y += -DQTFS_TEST_MODE") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUDS_TEST_MODE") +endif () + +## Forth, generate a Kbuild file +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Kbuild ${QTFS_KBUILD_FILE}) + +## Fifth, add a custom target to build the module +set(MODULE_CMD ${CMAKE_MAKE_PROGRAM} -C ${KBUILD_DIR} M=${CMAKE_CURRENT_BINARY_DIR}) +add_custom_command(OUTPUT ${MODULE_NAME}.ko + COMMAND ${MODULE_CMD} modules + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS ${QTFS_MODULE_SRC} ${CMAKE_CURRENT_BINARY_DIR}/Kbuild + VERBATIM) +add_custom_target(${MODULE_NAME} DEPENDS ${MODULE_NAME}.ko) +add_custom_target(${MODULE_NAME}-clean COMMAND ${MODULE_CMD} clean) + +# This target helps parsing C files for IDEs like CLion +add_library(dummy-${MODULE_NAME} EXCLUDE_FROM_ALL ${QTFS_MODULE_SRC}) +target_include_directories(dummy-${MODULE_NAME} PRIVATE include/ ${KBUILD_DIR}/include ipc/ qtfs/) +set_target_properties(dummy-${MODULE_NAME} PROPERTIES DEPRECATION "DO NOT BUILD THIS TARGET") \ No newline at end of file diff --git a/qtfs/qtfs_server/CMakeLists.txt b/qtfs/qtfs_server/CMakeLists.txt new file mode 100644 index 0000000..f3b4abd --- /dev/null +++ b/qtfs/qtfs_server/CMakeLists.txt @@ -0,0 +1,65 @@ +# Build Kernel modules +set(MODULE_NAME qtfs_server) + +## First, find the kernel build directory +execute_process( + COMMAND uname -r + OUTPUT_VARIABLE KERNEL_RELEASE + OUTPUT_STRIP_TRAILING_WHITESPACE) +set(KBUILD_DIR /lib/modules/${KERNEL_RELEASE}/build/) +find_file(KERNEL_MAKEFILE NAMES Makefile PATHS ${KBUILD_DIR} NO_DEFAULT_PATH) +if (NOT KERNEL_MAKEFILE) + message(FATAL_ERROR "There is no Makefile in ${KBUILD_DIR}!") +endif () + +## Second, gather the source files +set(COMM_SRC_FILES + ${QTFS_BASE_DIR}/qtfs_common/conn.c + ${QTFS_BASE_DIR}/qtfs_common/misc.c + ${QTFS_BASE_DIR}/qtfs_common/qtfs_check.c + ${QTFS_BASE_DIR}/qtfs_common/socket.c + ${QTFS_BASE_DIR}/qtfs_common/symbol_wrapper.c) + +set(QTFS_SERVER_SRC_FILES + ${QTFS_BASE_DIR}/qtfs_server/fsops.c + ${QTFS_BASE_DIR}/qtfs_server/qtfs-server.c) + +set(QTFS_SERVER_MODULE_SRC ${COMM_SRC_FILES} ${QTFS_SERVER_SRC_FILES}) + +## Third, make the src files accessible to the kernel Makefile +set(MODULE_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/) +set(QTFS_SERVER_KBUILD_FILE "obj-m := ${MODULE_NAME}.o") +foreach (file ${QTFS_SERVER_MODULE_SRC}) + file(RELATIVE_PATH file "${CMAKE_CURRENT_SOURCE_DIR}" "${file}") + configure_file(${file} ${file} COPYONLY) + string(REPLACE ".c" ".o" file_obj "${file}") + set(QTFS_SERVER_KBUILD_FILE "${QTFS_SERVER_KBUILD_FILE}\n${MODULE_NAME}-y += ${file_obj}") +endforeach () + +set(QTFS_SERVER_KBUILD_FILE "${QTFS_SERVER_KBUILD_FILE}\nccflags-y += -I${QTFS_BASE_DIR}/include") +set(QTFS_SERVER_KBUILD_FILE "${QTFS_SERVER_KBUILD_FILE}\nccflags-y += -I${QTFS_BASE_DIR}/ipc") +set(QTFS_SERVER_KBUILD_FILE "${QTFS_SERVER_KBUILD_FILE}\nccflags-y += -I${QTFS_BASE_DIR}/qtfs_server") +set(QTFS_SERVER_KBUILD_FILE "${QTFS_SERVER_KBUILD_FILE}\nccflags-y += -DQTFS_SERVER") + +if (DEFINED UDS_TEST_MODE OR DEFINED QTFS_TEST_MODE) + set(QTFS_SERVER_KBUILD_FILE "${QTFS_SERVER_KBUILD_FILE}\nccflags-y += -DQTFS_TEST_MODE") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUDS_TEST_MODE") +endif () + +## Forth, generate a Kbuild file +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Kbuild ${QTFS_SERVER_KBUILD_FILE}) + +## Fifth, add a custom target to build the module +set(MODULE_CMD ${CMAKE_MAKE_PROGRAM} -C ${KBUILD_DIR} M=${CMAKE_CURRENT_BINARY_DIR}) +add_custom_command(OUTPUT ${MODULE_NAME}.ko + COMMAND ${MODULE_CMD} modules + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS ${QTFS_SERVER_MODULE_SRC} ${CMAKE_CURRENT_BINARY_DIR}/Kbuild + VERBATIM) +add_custom_target(${MODULE_NAME} DEPENDS ${MODULE_NAME}.ko) +add_custom_target(${MODULE_NAME}-clean COMMAND ${MODULE_CMD} clean) + +# This target helps parsing C files for IDEs like CLion +add_library(dummy-${MODULE_NAME} EXCLUDE_FROM_ALL ${QTFS_SERVER_MODULE_SRC}) +target_include_directories(dummy-${MODULE_NAME} PRIVATE include/ ${KBUILD_DIR}/include ipc/ qtfs_server/) +set_target_properties(dummy-${MODULE_NAME} PROPERTIES DEPRECATION "DO NOT BUILD THIS TARGET") \ No newline at end of file -- Gitee