根据生成生成文件时不可用的源文件在CMake中创建库
我有一个CMake配置文件,用于构建两个库:根据生成生成文件时不可用的源文件在CMake中创建库,cmake,Cmake,我有一个CMake配置文件,用于构建两个库: 第三方库(此处称为ThirdPartyLib),包含供应商提供的实时OS/板支持包。它使用autotools工具链在CMake外部构建 以前库的扩展版本(这里称为ExtendedThirdPartyLib) 不幸的是,我需要的一些源代码(各种工具)不是在(1)的普通构建脚本中构建的。因为我不想弄乱供应商构建脚本,所以我想添加另一个库(2),构建丢失的文件,从而从供应商扩展库 我希望能够在cmakfiles.txt中执行类似操作: cmake_mini
cmakfiles.txt
中执行类似操作:
cmake_minimum_required(VERSION 3.2)
project(bsp)
include(ExternalProject)
ExternalProject_Add(
ThirdPartyLib
URL <http://some.url/bsp.tar.bz2
BUILD_COMMAND make -C ../external/ThirdPartyLib/src
)
set_target_properties(ThirdPartyLib PROPERTIES EXCLUDE_FROM_ALL TRUE)
add_library(ExtendedThirdPartyLib
${CMAKE_CURRENT_BINARY_DIR}/some/path/missing_file1.c
${CMAKE_CURRENT_BINARY_DIR}/some/path/missing_file2.c
)
add_dependencies(ExtendedThirdPartyLib ThirdPartyLib)
target_include_directories(ExtendedThirdPartyLib PUBLIC
${CMAKE_CURRENT_BINARY_DIR}/some/path/include
)
target_link_libraries(ExtendedThirdPartyLib ThirdPartyLib)
cmake_最低要求(3.2版)
项目(bsp)
包括(外部项目)
外部项目添加(
第三方
URL就我个人而言,我不喜欢ExternalProject\u Add
命令,因为它做了太多不合我口味的事情,但我已经离题了
如果您这样做,其中bar
正在模拟您的ExtendedThirdPartyLib
目标,因为它取决于生成的文件,该怎么办
cmake_minimum_required(VERSION 3.11)
project(lol C)
set(SOURCES lol.c) # only this file exists
add_library(lol ${SOURCES})
set(FOO_FILES "foo1.c" "foo2.c")
add_custom_command(OUTPUT ${FOO_FILES}
COMMAND ${CMAKE_COMMAND} -E touch ${FOO_FILES}
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
COMMENT "Creating ${FOO_FILES}"
VERBATIM)
add_custom_target(foo DEPENDS ${FOO_FILES})
add_library(bar ${FOO_FILES})
add_dependencies(bar foo)
target_link_libraries(lol bar)
整个方法取决于这样一个事实,即获取生成/生成文件的方法是通过自定义命令和关联的自定义目标显式定义的
您应该修改自定义命令以从tarball中提取所需的文件(例如,甚至可以调用一些外部脚本)(可能需要使用curl或类似工具下载)。它似乎可以工作!尽管我不太明白为什么。如果我理解正确,在实际构建过程中会运行自定义命令(生成生成生成文件时不需要)。因此,生成生成生成文件时,要bar的输入源文件仍然不存在,但在这种情况下,CMake似乎可以。@arghol是的,这是正确的,加上自定义命令和自定义目标之间的依赖项“链接”(请参阅我在发布的伪CMakeLists.txt
之后的注释).另外,请看一下关于这两个命令的文档,它非常好,比我在这里给出的任何答案都要完整。