first init
This commit is contained in:
90
CMakeLists.txt
Normal file
90
CMakeLists.txt
Normal file
@@ -0,0 +1,90 @@
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
|
||||
project(has_project_host LANGUAGES C)
|
||||
|
||||
# 当前宿主工程通过 add_subdirectory(has_platform) 的方式接入平台子仓库,
|
||||
# 以模拟真实项目拉取 has_platform 子仓库后的编译场景。
|
||||
|
||||
set(CMAKE_C_STANDARD 11)
|
||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||
|
||||
# 宿主工程选择如何集成 has_platform:
|
||||
# static: 链接静态库
|
||||
# shared: 链接动态库
|
||||
# embed : 直接把 has_platform 对象文件并入宿主目标
|
||||
set(HAS_PLATFORM_LINK_MODE "static" CACHE STRING
|
||||
"How the host project integrates has_platform: static, shared or embed")
|
||||
set_property(CACHE HAS_PLATFORM_LINK_MODE PROPERTY STRINGS static shared embed)
|
||||
|
||||
if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/has_project/has_platform_config.h")
|
||||
message(FATAL_ERROR
|
||||
"Missing has_project/has_platform_config.h. "
|
||||
"The host project must provide has_platform_config.h.")
|
||||
endif()
|
||||
|
||||
# 宿主工程显式告诉 has_platform 去 has_project/ 里查找配置头,
|
||||
# 这样可以模拟外部项目拉取子仓库后的真实接入方式。
|
||||
set(HAS_PLATFORM_CONFIG_DIR "${CMAKE_CURRENT_LIST_DIR}/has_project" CACHE PATH
|
||||
"Directory that provides has_platform_config.h for has_platform" FORCE)
|
||||
|
||||
# 根据宿主工程的接入方式控制 has_platform 子仓库输出何种目标。
|
||||
if(HAS_PLATFORM_LINK_MODE STREQUAL "static")
|
||||
set(HAS_PLATFORM_BUILD_STATIC ON CACHE BOOL "" FORCE)
|
||||
set(HAS_PLATFORM_BUILD_SHARED OFF CACHE BOOL "" FORCE)
|
||||
elseif(HAS_PLATFORM_LINK_MODE STREQUAL "shared")
|
||||
set(HAS_PLATFORM_BUILD_STATIC OFF CACHE BOOL "" FORCE)
|
||||
set(HAS_PLATFORM_BUILD_SHARED ON CACHE BOOL "" FORCE)
|
||||
elseif(HAS_PLATFORM_LINK_MODE STREQUAL "embed")
|
||||
set(HAS_PLATFORM_BUILD_STATIC OFF CACHE BOOL "" FORCE)
|
||||
set(HAS_PLATFORM_BUILD_SHARED OFF CACHE BOOL "" FORCE)
|
||||
else()
|
||||
message(FATAL_ERROR
|
||||
"Unsupported HAS_PLATFORM_LINK_MODE='${HAS_PLATFORM_LINK_MODE}'. "
|
||||
"Expected one of: static, shared, embed")
|
||||
endif()
|
||||
|
||||
add_subdirectory(has_platform)
|
||||
|
||||
# 宿主工程业务源码。保持 has_project 现有目录结构不变。
|
||||
file(GLOB HOST_APP_SOURCES CONFIGURE_DEPENDS
|
||||
"${CMAKE_CURRENT_LIST_DIR}/has_project/has_app/*.c"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/has_project/has_app/gui/*.c"
|
||||
# "${CMAKE_CURRENT_LIST_DIR}/has_project/has_app/sensor/*.c"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/has_project/has_app/wifi/*.c"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/has_project/has_app/acm/*.c"
|
||||
)
|
||||
|
||||
file(GLOB HOST_DRIVER_SOURCES CONFIGURE_DEPENDS
|
||||
"${CMAKE_CURRENT_LIST_DIR}/has_project/has_driver/v851/*.c"
|
||||
)
|
||||
|
||||
set(HOST_PROJECT_SOURCES
|
||||
${HOST_APP_SOURCES}
|
||||
${HOST_DRIVER_SOURCES}
|
||||
)
|
||||
|
||||
if(HOST_PROJECT_SOURCES STREQUAL "")
|
||||
message(FATAL_ERROR "No host project sources were found under has_project/")
|
||||
endif()
|
||||
|
||||
add_executable(test ${HOST_PROJECT_SOURCES})
|
||||
|
||||
target_compile_features(test PRIVATE c_std_11)
|
||||
|
||||
# 宿主工程根据选择的模式链接或嵌入 has_platform。
|
||||
if(HAS_PLATFORM_LINK_MODE STREQUAL "static")
|
||||
target_link_libraries(test PRIVATE has_platform::static)
|
||||
elseif(HAS_PLATFORM_LINK_MODE STREQUAL "shared")
|
||||
target_link_libraries(test PRIVATE has_platform::shared)
|
||||
elseif(HAS_PLATFORM_LINK_MODE STREQUAL "embed")
|
||||
has_platform_embed_in_target(test)
|
||||
endif()
|
||||
|
||||
# 将可执行文件输出到 build/ 根目录,便于脚本统一运行。
|
||||
set_target_properties(test PROPERTIES
|
||||
OUTPUT_NAME test
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
|
||||
)
|
||||
|
||||
message(STATUS "HAS_PLATFORM_LINK_MODE = ${HAS_PLATFORM_LINK_MODE}")
|
||||
|
||||
Reference in New Issue
Block a user