【问题标题】:Howto include selected sources from third party project in CMake如何在 CMake 中包含来自第三方项目的选定源
【发布时间】:2026-01-10 15:15:01
【问题描述】:

我有一个基于 CMake 的项目,它依赖于我需要下载和提取的外部资源。我决定使用 ExternalProject_Add 来完成其中的一部分。问题是如何使 add_library 规则依赖于一些提取的文件。

这是我目前所得到的:

# This line is needed for the ExternalProject command to work.
# It references the the Module in the cmake distro
include(ExternalProject)

# Download and extract the FreeRTOS core sources
set(FREERTOS_DIR    "${CMAKE_CURRENT_SOURCE_DIR}/FreeRTOS")
set(FREERTOS_URL    "http://downloads.sourceforge.net/project/freertos/FreeRTOS/V6.0.2/FreeRTOSV6.0.2.zip")
set(FREERTOS_CORE_DIR ${FREERTOS_DIR}/Source)

set(FREERTOS_SOURCES "${FREERTOS_CORE_DIR}/croutine.c"
    ${FREERTOS_CORE_DIR}/list.c 
    ${FREERTOS_CORE_DIR}/queue.c 
    ${FREERTOS_CORE_DIR}/tasks.c
    ${FREERTOS_CORE_DIR}/portable/MemMang/heap_3.c)

include_directories(${FREERTOS_CORE_DIR}/include)

add_library(freertos STATIC ${FREERTOS_SOURCES})

ExternalProject_Add(freertos_download
    DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}
    SOURCE_DIR ${FREERTOS_DIR}
    URL ${FREERTOS_URL}
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND "")

注意我已禁用外部项目中的配置、构建和安装步骤。

正如预期的那样,因为我没有指定依赖项,所以我收到以下错误

-- Configuring done
CMake Error at third-party/CMakeLists.txt:20 (add_library):
  Cannot find source file:

    /home/dushara/prj/sw/djetk-demo/djetk/third-party/FreeRTOS/Source/croutine.c

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx

我尝试过使用

add_dependencies(freertos_download freertos)

但这行不通。

理想情况下,我希望 FREERTOS_SOURCES 中的所有项目都依赖于外部项目的提取阶段。关于如何实现这一目标的任何想法?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    CMake 将在配置步骤期间尝试查看库的源文件是否存在,但正如您所体验的,外部项目的下载步骤在配置期间并未完成。

    您可以通过在文件上设置GENERATED 属性来告诉 CMake 不要担心不存在的文件:

    set_source_files_properties(${FREERTOS_SOURCES} PROPERTIES GENERATED TRUE)
    

    您仍应将外部项目作为依赖项添加到您的库中,以确保首先下载和提取它,但在您的示例中,命令不正确;应该是:

    add_dependencies(freertos freertos_download)
    

    所以依赖某物的目标是第一个参数,其依赖关系在后面列出。

    【讨论】:

      最近更新 更多