在我的CMakeLists.txt中,我将add_custom_command与add_custom_target结合使用以调用代码生成步骤。
如果代码生成步骤成功完成,但是缺少add_custom_command的OUTPUT参数中提到的文件之一,则出于Why does GNU make delete a file
中概述的原因,make将删除OUTPUT中提到的第一个文件。(第一个输出文件,因为它是与生成的Makefile中的命令关联的“主”文件)
到目前为止,太好了。我的问题是这不会立即使构建失败。相反,当在编译中实际使用生成的代码时,编译器会抱怨缺少标头,具有讽刺意味的是,标头不是生成器未生成的文件,而是已删除的文件。
只有在使用VERBOSE = 1运行make时,才会出现解释文件已删除的消息。
Deleting primary custom command output "/app/tests/eclipseProject/projects/math/build/aragen/matrix2Component/matrix2/includes/serviceInterfaces/matrix/proxy_Mat_SI.h" because another output "/app/tests/eclipseProject/projects/math/build/aragen/matrix2Component/matrix2/vsomeip/serviceInterfaces/matrix/proxy_vsomeip_Mat_SI.h" does not exist.
在尝试执行生成目标之前,如何确保在执行编译之前,编译会失败?
答案 0 :(得分:0)
如果您只需要支持POSIX平台(例如Linux,Mac OS,带有Make工具链的Windows),则可以在namespace { extern "C" void f(); }
中添加显式检查:
add_custom_command
但这不是100%可移植的。如果set(output_file_check "test" "whether expected files were generated:")
foreach(output_file IN LISTS output_files)
list(APPEND output_file_check "-a" "-e" "${output_file}")
endforeach()
add_custom_command(
OUTPUT ${output_files}
COMMAND "your_generator"
COMMAND "${CMAKE_COMMAND}" -E echo "Checking whether all expected files have been generated..."
COMMAND ${output_file_check}
COMMAND "${CMAKE_COMMAND}" -E echo "Success: All expected files are present."
VERBATIM
)
可以选择检查输出文件,那就更好了。