强制CMake在执行任何其他操作之前执行代码生成器

强制CMake在执行任何其他操作之前执行代码生成器,cmake,ros,catkin,Cmake,Ros,Catkin,我似乎无法理解这一点。我用的是柳絮。基本上我想生成一个rqt_配置GUI 但是,我想自动生成配置文件和消息文件。所以我写了一个发电机。使用add\u custom\u target我成功地获得了名为: add_custom_target( generate ALL WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} BYPRODUCTS cfg/${PROJECT_NAME}.cfg msg/${PROJECT_NAME}.msg

我似乎无法理解这一点。我用的是柳絮。基本上我想生成一个rqt_配置GUI

但是,我想自动生成配置文件和消息文件。所以我写了一个发电机。使用
add\u custom\u 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\u message\u files
找不到生成的文件,并且不生成文件,即使前面有
add\u custom\u target

我只想确保首先运行
add\u custom\u target


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

看起来
add_message_files
希望在配置阶段,当CMake处理
CMakeLists.txt
时立即查看文件。但是,
add\u custom\u target
仅在构建阶段执行其命令

您需要立即运行生成器,改为使用:


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

以任何形式,在编译阶段执行
add\u custom\u目标
/
add\u custom\u命令
,这是在解析
CMakeLists.txt
的配置阶段之后执行的。但是,
add_message_files
似乎希望在配置阶段立即查看该文件。因此,您需要使用
execute\u process
创建文件,该文件也会立即执行。@Tsyvarev谢谢!它现在似乎起作用了。由于某种原因,我以前试过Excel程序,但它根本没有产生。如果你有一个工作解决方案,请考虑写一个快速回答邮件,并标记为接受。@ ScasRektTeles你是指我还是Tsyvarev?我不想盗取他的分数。@CodeMonkey请自己发布一个!
execute_process(
    COMMAND rosrun my_generator my_generator.pc
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)