diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index f1139cf..137de78 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -4,65 +4,62 @@ get_filename_component(TARGET_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) option(A_BUILD_MAIN_AS_STATIC_LIB "Build as a static library instead of an executable" OFF) -set(MAIN_SRCS - main.c -) - -if(A_BUILD_MAIN_AS_STATIC_LIB) - add_library(${TARGET_NAME} STATIC ${MAIN_SRCS}) -else() - add_executable(${TARGET_NAME} ${MAIN_SRCS}) -endif() - -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - target_compile_definitions(${TARGET_NAME} PRIVATE DEBUG) -endif() - +# ─── 创建目标 ──────────────────────────────────────────────────────── if(A_BUILD_MAIN_AS_STATIC_LIB) + add_library(${TARGET_NAME} STATIC main.c) set_target_properties(${TARGET_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/output ) else() + add_executable(${TARGET_NAME} main.c) set_target_properties(${TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/output ) endif() +# ─── 编译宏定义 ───────────────────────────────────────────────────── +target_compile_definitions(${TARGET_NAME} PRIVATE + $<$:DEBUG> + ${GLOBAL_ENABLED_MACROS} +) + +# ─── Include 目录 ──────────────────────────────────────────────────── target_include_directories(${TARGET_NAME} - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ) +# ─── 链接模块 ──────────────────────────────────────────────────────── +if(GLOBAL_ENABLED_MODULES) + message(STATUS "[Main] Linking modules: ${GLOBAL_ENABLED_MODULES}") + target_link_libraries(${TARGET_NAME} PUBLIC ${GLOBAL_ENABLED_MODULES}) +else() + message(STATUS "[Main] No additional modules linked.") +endif() + +# ─── 平台链接依赖 ─────────────────────────────────────────────────── string(TOLOWER "${CMAKE_SYSTEM_NAME}" SYSTEM_NAME_LOWER) if(CMAKE_CROSSCOMPILING AND NOT SYSTEM_NAME_LOWER MATCHES "linux|windows|darwin|android") - message(STATUS ">>> 检测到裸机/RTOS 环境 (${CMAKE_SYSTEM_NAME}),屏蔽 pthread。") + message(STATUS ">>> 裸机/RTOS 环境 (${CMAKE_SYSTEM_NAME}),屏蔽 pthread") else() find_package(Threads REQUIRED) - target_link_libraries(${CURRENT_TARGET_NAME} - PUBLIC Threads::Threads + target_link_libraries(${TARGET_NAME} + PUBLIC Threads::Threads PRIVATE ${CMAKE_DL_LIBS} ) if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - target_link_libraries(${CURRENT_TARGET_NAME} PRIVATE rt) + target_link_libraries(${TARGET_NAME} PRIVATE rt) endif() endif() -if(DEFINED GLOBAL_ENABLED_MODULES AND NOT GLOBAL_ENABLED_MODULES STREQUAL "") - message(STATUS "[Main] Linking modules: ${GLOBAL_ENABLED_MODULES}") - target_link_libraries(${TARGET_NAME} PUBLIC ${GLOBAL_ENABLED_MODULES}) -else() - message(STATUS "[Main] No additional modules linked.") -endif() - -if(DEFINED GLOBAL_ENABLED_MACROS AND NOT GLOBAL_ENABLED_MACROS STREQUAL "") - message(STATUS "[Main] Defining macros: ${GLOBAL_ENABLED_MACROS}") - target_compile_definitions(${TARGET_NAME} PUBLIC ${GLOBAL_ENABLED_MACROS}) -endif() +# ─── 编译选项 ──────────────────────────────────────────────────────── +target_compile_options(${TARGET_NAME} PRIVATE + -Wall -Werror + -ffunction-sections -fdata-sections + $<$:-g -O0> + $<$:-O2> +) -target_compile_options(${TARGET_NAME} - PRIVATE - -Wall - -Werror - $<$:-g -O0> - $<$:-O2> -) \ No newline at end of file +target_link_options(${TARGET_NAME} PRIVATE + -Wl,--gc-sections + $<$:-s> +)