我正在使用可生成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
)。
答案 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的更好的功夫方法。我觉得它就在那里,一旦找到它,我就会更新此答案。