Protocol buffers Makefile协议缓冲区文件的自动依赖性问题

Protocol buffers Makefile协议缓冲区文件的自动依赖性问题,protocol-buffers,gnu-make,automake,Protocol Buffers,Gnu Make,Automake,在生成文件中建立自动依赖关系时遇到问题。我们的目标是从多个协议缓冲文件中创建一个C++库,其中一些可能是只读目录。要绕过写权限,我想在MaMaCtory目录中生成C++文件。实际的Makefile是从Makefile.am创建的。下面的简化脚本应该能够实现构建自动依赖项的功能,但它不能: mypbfiles = /usr/share/project/my_file.proto MY_PB_FILES = $(notdir ${mypbfiles}) MY_SOURCE_FILES = ${MY_

在生成文件中建立自动依赖关系时遇到问题。我们的目标是从多个协议缓冲文件中创建一个C++库,其中一些可能是只读目录。要绕过写权限,我想在MaMaCtory目录中生成C++文件。实际的Makefile是从Makefile.am创建的。下面的简化脚本应该能够实现构建自动依赖项的功能,但它不能:

mypbfiles = /usr/share/project/my_file.proto
MY_PB_FILES = $(notdir ${mypbfiles})
MY_SOURCE_FILES = ${MY_PB_FILES:.proto=.pb.cc}

lib_LTLIBRARIES = lib@PACKAGE_NAME@_protobuf.la
lib@PACKAGE_NAME@_protobuf_la_SOURCES = ${MY_SOURCE_FILES}
lib@PACKAGE_NAME@_protobuf_la_LDFLAGS = -version-info @MAJOR_VERSION@:@MINOR_VERSION@:0

$(MY_SOURCE_FILES): $(mypbfiles)
    @for proto_file in $(mypbfiles); do \
        gen_file=`echo ${proto_file} | perl -pe 's/\.proto/\.pb\.cc/; s|.*/||'`;\
        echo "*** Building ${gen_file} from $${proto_file} ***"; \
        protoc -I${mypbdir} --cpp_out=./ $${proto_file};\
done

LTLIBRARIES = $(lib_LTLIBRARIES)
all: Makefile $(LTLIBRARIES)
然后我决定在脚本中添加以下两行:

foo:
    echo ${MY_SOURCE_FILES}
运行“make foo”显示以下输出:

echo my_file.pb.cc
my_file.pb.cc
因此,MY_SOURCE_文件确实包含正确的值,但未建立依赖关系。但是,在脚本中进行以下更改可以解决此问题:

lib@PACKAGE_NAME@_protobuf_la_SOURCES = my_file.pb.cc
你可能会问,为什么不做出改变,并为此感到高兴?问题是Makefile.am被馈送到一个处理lib@PACKAGE_NAME@_protobuf_xxx’。所以我必须想办法让事情顺利进行!我的怀疑是,使用'notdir'函数不知何故并没有按照我的意图扩展变量'My_PB_FILES'

我并不完全精通GNU Makefile,因此非常感谢您的任何建议或帮助

目标是从多个协议缓冲文件中创建一个C++库,其中一些可能是只读目录。 你不能把它们复制到
$(top\u builddir)
来解决这个问题吗

为了绕过写权限,我想在MaMaCtory目录中生成C++文件。 因此,它们也将出现在

$(top\u builddir)

您可能应该检查给出的答案,该答案设置了协议缓冲区编译器,更重要的是在Makefile.am中设置了规则。您可能需要根据您的情况对其进行一些修改

基本上是这样的:

my_file.proto : /usr/share/project/my_file.proto
    cp $< $@

%.pb.cc %.pb.h: %.proto
    $(PROTOC) --proto_path=$(dir $^) --cpp_out=$(dir $^) $^

lib_LTLIBRARIES = lib@PACKAGE_NAME@_protobuf.la
lib@PACKAGE_NAME@_protobuf_la_SOURCES = my_file.pb.cc
lib@PACKAGE_NAME@_protobuf_la_LDFLAGS = -version-info @MAJOR_VERSION@:@MINOR_VERSION@:0
my_file.proto:/usr/share/project/my_file.proto
cp$<$@
%.pb.cc%.pb.h:%.proto
$(PROTOC)--proto_path=$(dir$^)--cpp_out=$(dir$^)$^
库=lib@PACKAGE_NAME@_原蟾蜍
lib@PACKAGE_NAME@_protobuf_la_SOURCES=my_file.pb.cc
lib@PACKAGE_NAME@_protobuf_la_LDFLAGS=-version info@MAJOR_version@:@MINOR_version@:0
这里我看到的唯一棘手的事情是:当调用
makedist
时,tarball中会出现什么?
是否确实要分发
my_file.pb.cc

在您的示例中使用
lib@PACKAGE_NAME@_protobuf_la_来源
在您的“固定”示例中,您使用的是
lib@PACKAGE_NAME@_protobuf_la_SOURCE
(无
S
)。这是问题中的错别字吗?另外,您没有明确说明“依赖关系未建立”的确切含义。。。你想发生什么事而没有发生?那是个打字错误。我会编辑帖子。谢谢你的注意。我确实希望看到以下语句:**Building my_file.pb.cc from/usr/share/project/my_file.proto***在我看来,这就像一个自动生成的文件。我想你需要和汽车制造商的人讨论一下。我的怀疑是automake正在为您处理一些可以正常使用静态字符串(如
My_file.pb.cc
)的内容,但不会扩展变量(如
${My_SOURCE_FILES}
),因此无法正常工作。我也考虑过这一点,但不确定这是否是automake的问题。如果您手动修改生成的makefile,并将my_file.pb.cc静态分配给${my_SOURCE_FILES},则make将按预期工作。是的,这就是我上面所说的“automake正在为您处理某些事情”。也就是说,automake可能正在查看makefile,并对源文件执行一些特殊的操作。但由于automake不是make,它要求变量中的值是显式的,而不是变量中的值。我对automake的了解还不够,所以我建议你问问automake的人。目的是避免手动包含my_file.proto和my_file.pb.cc。Makefile.am可能包含许多.proto文件,或者该文件在其生命周期内经历多次修改。期望开发人员始终记住这种情况是不合理的。正如@MadScientist正确指出的,这个问题与automake无法扩展MY_SOURCE_文件以建立依赖关系有关。我问过汽车制造商的人一个类似的问题,但还没有收到任何人的来信。