我在Makefile中建立自动依赖时遇到问题。目标是从许多协议缓冲区文件创建一个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'。所以我必须找到让事情有效的方法!我怀疑是否使用了'#dirir'函数以某种方式不会扩展变量' MY_PB_FILES'我想要的方式。
我不是那些精通GNU Makefile的人,所以非常感谢任何建议或帮助。
答案 0 :(得分:0)
目标是从许多协议缓冲区文件创建一个C ++库,其中一些文件可能位于只读目录中。
你难道不能将它们复制到$(top_builddir)
来解决这个问题吗?
要绕过写入权限,我想在Makefile目录中生成C ++文件。
所以这些也会在$(top_builddir)
中。
您应该查看给出here的答案,该答案设置协议缓冲区编译器,更重要的是在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
吗?