Следующие CMakeLists объявляют пользовательскую команду для компиляции 2 файлов protobuf: msg1.proto
(автономно) и msg2.proto
(включает msg1.proto
).
cmake_minimum_required(VERSION 3.13)
foreach(pfile msg1.proto;msg2.proto)
string(REPLACE ".proto" ".pb.cc" proto_source "${pfile}")
string(REPLACE ".proto" ".pb.h" proto_header "${pfile}")
add_custom_command(
OUTPUT ${proto_source} ${proto_header}
BYPRODUCTS ${CMAKE_CURRENT_SOURCE_DIR}/${pfile}.d
COMMAND protoc -I=.. --cpp_out=. --dependency_out=${pfile}.d ${pfile}
DEPFILE ${pfile}.d
DEPENDS ${pfile}
)
endforeach()
add_library(mylib msg2.pb.cc)
Сгенерированный файл msg2.proto.d
правильно объявляет зависимость между msg2.pb.cc
и msg1.pb.h
, но msg1.pb.h
никогда не создается, а компиляция msg2.pb.cc
все еще не выполняется.
$ ninja
[2/3] Building CXX object CMakeFiles/mylib.dir/msg2.pb.cc.o
FAILED: CMakeFiles/mylib.dir/msg2.pb.cc.o
/usr/bin/c++ -MD -MT CMakeFiles/mylib.dir/msg2.pb.cc.o -MF CMakeFiles/mylib.dir/msg2.pb.cc.o.d -o CMakeFiles/mylib.dir/msg2.pb.cc.o -c msg2.pb.cc
In file included from msg2.pb.cc:4:
msg2.pb.h:33:10: fatal error: msg1.pb.h: No such file or directory
#include "msg1.pb.h"
^~~~~~~~~~~
Чего не хватает для работы опции DEPFILE?