我无法在我的 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 并不十分精通,因此非常感谢任何建议或帮助。