强制 CMake 先执行代码生成器

Force CMake to execute code generator before anything else

我好像想不通。我正在使用 catkin/CMake。基本上我想生成一个 rqt_configure GUI。

但是我想为此自动生成配置和消息文件。所以我写了一个生成器。使用 add_custom_target 我设法获得名为的脚本:

add_custom_target(
    generate ALL
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    BYPRODUCTS cfg/${PROJECT_NAME}.cfg msg/${PROJECT_NAME}.msg launch/${PROJECT_NAME}.launch scripts/callback.py
    COMMAND rosrun my_generator my_generator.pc
)

一旦我尝试使用生成的代码 catkin 构建失败:

    generate_dynamic_reconfigure_options(
        cfg/${PROJECT_NAME}.cfg
    )

    add_message_files(
        FILES ${PROJECT_NAME}.msg
    )

    generate_messages(
        DEPENDENCIES
    )

它说add_message_files找不到生成的文件,并且没有生成文件,即使add_custom_target在前面。

我只想确保 add_custom_target 首先是 运行。

我读到的关于确保顺序的所有内容都说我应该使用 add_depencies( 生成),但是我不知道要附加到哪个目标以抢占这些宏。

看起来 add_message_files 想要在 配置 阶段立即 查看文件,当 CMake 处理 CMakeLists.txt.但是 add_custom_target 只在 build 阶段执行它的 COMMAND。

您需要立即 运行 您的发电机,使用 execute_process 代替:

execute_process(
    COMMAND rosrun my_generator my_generator.pc
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)

(传递额外的 RESULT_VARIABLE 选项可能很有用,因此可以检查命令调用是否成功)。