我有一个基于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中的所有项目都取决于外部项目的提取阶段。关于如何实现这一目标的任何想法?
答案 0 :(得分:4)
CMake将在配置步骤中尝试查看库的源文件是否存在,但是您在配置过程中没有完成外部项目的下载步骤。
您可以通过在其上设置GENERATED
属性来告诉CMake不要担心不存在的文件:
set_source_files_properties(${FREERTOS_SOURCES} PROPERTIES GENERATED TRUE)
您仍然应该将外部项目作为依赖项添加到您的库中,以确保它已下载&首先提取,但在您的示例中,命令不正确;它应该是:
add_dependencies(freertos freertos_download)
所以取决于某事物的目标是第一个参数,之后列出了它的依赖关系。