强制 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
选项可能很有用,因此可以检查命令调用是否成功)。
我好像想不通。我正在使用 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
选项可能很有用,因此可以检查命令调用是否成功)。