CMake在自定义命令中调用add_subdirectory

时间:2019-03-22 14:39:44

标签: cmake dependencies

我正在使用可生成C ++和CMakeLists.txt文件的代码生成器,不幸的是,我无法在我的主CMakeLists.txt文件中使用此代码进行测试。

例如,您具有以下CMakeLists.txt文件:

select distinct b.customer_id 
from beverage b, coffe c
where b.bid = c.bid
intersect
select distinct b.customer_id 
from beverage b, tea t
where b.bid = t.bid;

仅在对特定目标(例如project(SomeProject CXX C) add_custom_command(OUTPUT ${SRCS} COMMAND ${CODEGEN_CLI_PATH} -i "${INPUT}" -o "${OUT}" COMMENT "Generating sources" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} VERBATIM ) add_custom_target(CODEGEN DEPENDS ${SRCS} ) # Needs to be executed after the custom command add_subdirectory(${GENERATED_CMAKE_LISTS_LOCATION}) )执行自定义命令之后,才可以使用诸如add_subdirectory之类的功能吗?

我已经尝试通过在现有的自定义命令中添加额外的一行来执行它:

CODEGEN

不幸的是,这不起作用,因为它不允许在脚本模式下执行类似 COMMAND ${CMAKE_COMMAND} -D DIR=${GENERATED_CMAKE_LISTS_LOCATION} -P add_subdirectories.cmake 之类的功能。

我都无法从位于同一文件中的add_subdirectory调用自定义函数(正在执行add_subdirectory)。

2 个答案:

答案 0 :(得分:0)

不,这是不可能的。 add_subdirectory命令在配置步骤中运行,而CODEGEN是在构建过程中运行的目标。

您似乎做错了什么,所以我能给您的唯一建议是使用execute_process命令来运行所需的命令。 execute_process命令在配置阶段执行,因此它将能够生成add_subdirectory之前需要的文件。

但是再次,请描述您的问题,为什么要让CMake这样做。

答案 1 :(得分:0)

我有一个巨大的固定无符号char数组,可以将其编译到静态库中。我的解决方法是:

if(NOT EXISTS ${PATH_TO_FOLDER}/smeagol.a)
    add_subdirectory(smeagol)
endif()

我仍在寻找一种使用cmake的更好的功夫方法。我觉得它就在那里,一旦找到它,我就会更新此答案。