0

我无法在我的 Makefile 中建立自动依赖关系。目标是从许多 Protocol Buffer 文件创建一个 C++ 库,其中一些可能位于只读目录中。为了绕过写权限,我想在 Makefile 目录中生成 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_FILES 确实包含正确的值,但没有建立依赖关系。但是,在脚本中进行以下更改可以解决问题:

lib@PACKAGE_NAME@_protobuf_la_SOURCES = my_file.pb.cc

你可能会问为什么不做出改变并对此感到满意呢?问题是 Makefile.am 被提供给处理“lib@PACKAGE_NAME@_protobuf_xxx”的程序。所以我必须想办法让事情顺利进行!我怀疑使用“notdir”函数不会以我想要的方式扩展变量“MY_PB_FILES”。

我对 GNU Makefile 并不十分精通,因此非常感谢任何建议或帮助。

4

1 回答 1

0

目标是从许多 Protocol Buffer 文件创建一个 C++ 库,其中一些可能位于只读目录中。

你不能只是复制它们来$(top_builddir)解决这个问题吗?

为了绕过写权限,我想在 Makefile 目录中生成 C++ 文件。

所以这些也会出现$(top_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

make dist我在这里看到的唯一棘手的事情是:调用时进入 tarball 的内容是什么?你真的要分发my_file.pb.cc吗?

于 2013-07-07T22:43:58.993 回答