如何在autoconf / automake中使用协议缓冲区?

时间:2012-12-18 19:16:10

标签: protocol-buffers automake

寻找一个用于构建使用协议缓冲区的项目的autoconf和automake规则的好例子,将protoc添加到构建过程的最佳方法是什么?

1 个答案:

答案 0 :(得分:14)

configure.ac

就protobuf库而言,它使用pkg-config,因此最好使用PKG_CHECK_MODULES宏来引用它:

PKG_CHECK_MODULES(PROTOBUF, protobuf >= 2.4.0)
AC_SUBST(PROTOBUF_LIBS)
AC_SUBST(PROTOBUF_CFLAGS)
AC_SUBST(PROTOBUF_VERSION)

并检查路径中的protoc命令。这是一个非常基本的检查,它在路径中:

AC_CHECK_PROG([PROTOC], [protoc], [protoc])
AS_IF([test "x${PROTOC}" == "x"],
    [AC_MSG_ERROR([ProtoBuf compiler "protoc" not found.])])

或者,允许用户使用protoc或使用环境变量--with-protoc=/path/to/protoc指定不同的PROTOC

# ProtoBuf compiler.
# First, specify with --with-protoc=/path/of/protoc.
# Or, specify with env variable PROTOC.
# If neither of the above, find it in the path.
#AC_MSG_CHECKING([for ProtoBuf compiler protoc])
AC_ARG_WITH([protoc],
    [AS_HELP_STRING([--with-protoc=/path/of/protoc],
        [Location of the protocol buffers compiler protoc. Defaults to looking on path.])],
    [PROTOC="$withval"],
    [ AS_IF([test "x${PROTOC}" == "x"],
        [AC_PATH_PROG([PROTOC], [protoc], [no])])
    ]
)
#AC_MSG_RESULT([${PROTOC}])
AS_IF([test "${PROTOC}" == "no"], [AC_MSG_ERROR([ProtoBuf compiler "protoc" not found.])])

Makefile.am

添加规则以构建proto文件:

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

使用dist_noinst_DATA指定protobuf源文件。这是必要的,以确保它们捆绑在使用.tar.gz制作的源代码分发make dist文件中。

dist_noinst_DATA = whatever.proto

(注意:对于较新版本的autoconf / automake,可能需要使用@builddir@代替$(builddir)。)

使用nodist_前缀和$(builddir)路径指定生成的文件:

nodist_myprog_SOURCES = $(builddir)/whatever.pb.cc $(builddir)/whatever.pb.h

并使用make clean清除它们:

MOSTLYCLEANFILES = whatever.pb.cc whatever.pb.h

使用BUILT_SOURCES处理构建的头文件的依赖项:

BUILT_SOURCES = whatever.pb.h

您的编译器标志可能需要引用构建目录来查找头文件(在VPATH构建中工作):

AM_CPPFLAGS += -I$(builddir)