From b7582b8da19d351e33ebd31f64da4cc3ed5b13f7 Mon Sep 17 00:00:00 2001 From: xuxin19 Date: Tue, 18 Feb 2025 21:23:27 +0800 Subject: [PATCH] cmake(feat):implements KERNEL mode in CMake build 1.add application link dependencies for all elf 2.add a global custom target to hold proptry in the toolchain file 3.add startup obj target 4.fix cpp lds error with kernel mod link elf lds usage: ./build.sh qemu-armv7a:knsh --cmake elf install in ${CMAKE_BINARY_DIR}/bin Signed-off-by: xuxin19 --- CMakeLists.txt | 20 +++++++++++--------- arch/arm/src/common/CMakeLists.txt | 2 ++ arch/arm/src/qemu/CMakeLists.txt | 2 +- cmake/nuttx_add_application.cmake | 12 ++++++++---- cmake/nuttx_add_library.cmake | 26 ++++++++++++++++++++++++++ cmake/nuttx_extensions.cmake | 8 ++++++++ cmake/nuttx_toolchain.cmake | 2 +- libs/libc/elf/CMakeLists.txt | 9 +++++++++ 8 files changed, 66 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4761cb6560e..24c26ed015d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -378,6 +378,12 @@ if(NOT EXISTS ${CMAKE_BINARY_DIR}/.config OR NOT "${NUTTX_DEFCONFIG}" STREQUAL message(STATUS " Appdir: ${NUTTX_APPS_DIR}") endif() +# declare global custom targets at very beginning `nuttx_global` is used to hold +# global target properties to solve that cmake GLOBAL property can not use +# generator expression this is needed to make sure added before project() create +# before Toolchain file added before all cmake modules are loaded +add_custom_target(nuttx_global) + # Include .cmake files ####################################################### # this exposes all Kconfig vars to CMake @@ -598,15 +604,11 @@ endif() # Add apps/ to the build (if present) -if(NOT CONFIG_BUILD_KERNEL) - - if(EXISTS ${NUTTX_APPS_DIR}/CMakeLists.txt) - add_subdirectory(${NUTTX_APPS_DIR} apps) - else() - message( - STATUS "Application directory not found at ${NUTTX_APPS_DIR}, skipping") - endif() - +if(EXISTS ${NUTTX_APPS_DIR}/CMakeLists.txt) + add_subdirectory(${NUTTX_APPS_DIR} apps) +else() + message( + STATUS "Application directory not found at ${NUTTX_APPS_DIR}, skipping") endif() # after we traverse all build directories unify all target dependencies and all diff --git a/arch/arm/src/common/CMakeLists.txt b/arch/arm/src/common/CMakeLists.txt index a47d071a59e..3bbbee40b44 100644 --- a/arch/arm/src/common/CMakeLists.txt +++ b/arch/arm/src/common/CMakeLists.txt @@ -92,3 +92,5 @@ if(CONFIG_ARCH_HAVE_FETCHADD) endif() target_sources(arch PRIVATE ${SRCS}) + +nuttx_add_aux_library(STARTUP_OBJS crt0.c) diff --git a/arch/arm/src/qemu/CMakeLists.txt b/arch/arm/src/qemu/CMakeLists.txt index fc628d31812..03585b259d5 100644 --- a/arch/arm/src/qemu/CMakeLists.txt +++ b/arch/arm/src/qemu/CMakeLists.txt @@ -23,7 +23,7 @@ set(SRCS qemu_boot.c qemu_serial.c qemu_irq.c qemu_timer.c) if(CONFIG_ARCH_ARMV7A) - list(APPEND SRCS qemu_memorymap.c) + list(APPEND SRCS qemu_pgalloc.c qemu_memorymap.c) endif() if(CONFIG_SMP) diff --git a/cmake/nuttx_add_application.cmake b/cmake/nuttx_add_application.cmake index efee621dda7..c038bd565d5 100644 --- a/cmake/nuttx_add_application.cmake +++ b/cmake/nuttx_add_application.cmake @@ -112,14 +112,18 @@ function(nuttx_add_application) # non-elf output if(NOT CMAKE_C_ELF_COMPILER) add_library(${TARGET} ${SRCS}) - + add_dependencies(${TARGET} nuttx_post) add_custom_command( TARGET ${TARGET} POST_BUILD COMMAND - ${CMAKE_C_COMPILER} - $> - $ -o ${TARGET} + ${CMAKE_LD} + $> + -e __start -Bstatic -T ${CMAKE_BINARY_DIR}/gnu-elf.ld + $ --start-group + $> + $ --end-group -o + ${CMAKE_BINARY_DIR}/bin/${TARGET} COMMAND_EXPAND_LISTS) else() add_executable(${TARGET} ${SRCS}) diff --git a/cmake/nuttx_add_library.cmake b/cmake/nuttx_add_library.cmake index 2b4c1172bf1..d6ba8c0864c 100644 --- a/cmake/nuttx_add_library.cmake +++ b/cmake/nuttx_add_library.cmake @@ -118,6 +118,13 @@ function(nuttx_add_system_library target) # add to list of libraries to link to final nuttx binary set_property(GLOBAL APPEND PROPERTY NUTTX_SYSTEM_LIBRARIES ${target}) + + set_property( + TARGET nuttx_global + APPEND + PROPERTY NUTTX_ELF_LINK_LIBRARIES $) + + add_dependencies(nuttx_post ${target}) endfunction() # Kernel Libraries @@ -196,6 +203,14 @@ function(nuttx_add_library target) add_library(${target} ${ARGN}) add_dependencies(${target} apps_context) set_property(GLOBAL APPEND PROPERTY NUTTX_SYSTEM_LIBRARIES ${target}) + + set_property( + TARGET nuttx_global + APPEND + PROPERTY NUTTX_ELF_LINK_LIBRARIES $) + + add_dependencies(nuttx_post ${target}) + # Set apps global compile options & definitions hold by nuttx_apps_interface target_compile_options( ${target} @@ -236,6 +251,12 @@ function(nuttx_add_extra_library) set_property(GLOBAL APPEND PROPERTY NUTTX_USER_EXTRA_LIBRARIES ${extra_target}) endif() + if(CONFIG_BUILD_KERNEL) + set_property( + TARGET nuttx_global + APPEND + PROPERTY NUTTX_ELF_LINK_LIBRARIES $) + endif() endif() endforeach() endfunction() @@ -259,6 +280,11 @@ function(nuttx_add_external_library target) cmake_parse_arguments(ARGS "" MODE "" ${ARGN}) if(NOT ARGS_MODE) set_property(GLOBAL APPEND PROPERTY NUTTX_SYSTEM_LIBRARIES ${target}) + set_property( + TARGET nuttx_global + APPEND + PROPERTY NUTTX_ELF_LINK_LIBRARIES $) + add_dependencies(nuttx_post ${target}) elseif("${ARGS_MODE}" STREQUAL "APPS") set_property(GLOBAL APPEND PROPERTY NUTTX_APPS_LIBRARIES ${target}) elseif("${ARGS_MODE}" STREQUAL "KERNEL") diff --git a/cmake/nuttx_extensions.cmake b/cmake/nuttx_extensions.cmake index 89594dcdcfa..7e158ec4563 100644 --- a/cmake/nuttx_extensions.cmake +++ b/cmake/nuttx_extensions.cmake @@ -281,6 +281,14 @@ function(nuttx_compile_definitions_for_all_apps) PROPERTY APPS_COMPILE_DEFINITIONS ${ARGN}) endfunction() +# all elf link options +function(nuttx_add_elf_link_options) + set_property( + TARGET nuttx_global + APPEND + PROPERTY NUTTX_ELF_APP_LINK_OPTIONS ${ARGN}) +endfunction() + # since we dont call `target_link_libraries` directly, we only inherit their # compilation configuration function(nuttx_link_libraries) diff --git a/cmake/nuttx_toolchain.cmake b/cmake/nuttx_toolchain.cmake index beecf63424a..55ac9f92b33 100644 --- a/cmake/nuttx_toolchain.cmake +++ b/cmake/nuttx_toolchain.cmake @@ -91,7 +91,7 @@ if(NOT NUTTX_TOOLCHAIN_PREPROCESS_DEFINED) add_custom_command( OUTPUT ${TARGET_FILE} - COMMAND ${PREPROCESS} -I${CMAKE_BINARY_DIR}/include + COMMAND ${PREPROCESS} -I${CMAKE_BINARY_DIR}/include -I${NUTTX_DIR}/include -I${NUTTX_CHIP_ABS_DIR} ${SOURCE_FILE} > ${TARGET_FILE} DEPENDS ${SOURCE_FILE} ${DEPENDS}) diff --git a/libs/libc/elf/CMakeLists.txt b/libs/libc/elf/CMakeLists.txt index af65da605d8..cb9e3dc21b2 100644 --- a/libs/libc/elf/CMakeLists.txt +++ b/libs/libc/elf/CMakeLists.txt @@ -49,4 +49,13 @@ if(CONFIG_LIBC_ELF) target_sources(c PRIVATE ${SRCS}) + set(ELF_LD_SCRIPT_TMP "${CMAKE_BINARY_DIR}/gnu-elf.ld") + + nuttx_generate_preprocess_target( + SOURCE_FILE ${NUTTX_DIR}/libs/libc/elf/gnu-elf.ld.in TARGET_FILE + ${ELF_LD_SCRIPT_TMP}) + + add_custom_target(elfldscript_tmp DEPENDS ${ELF_LD_SCRIPT_TMP}) + add_dependencies(nuttx elfldscript_tmp) + endif()