プロトコル バッファを使用するプロジェクトをビルドするための autoconf および automake ルールの良い例を探しています。ビルド プロセスにプロトコルを追加する最良の方法はありますか?
2 に答える
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) $^
でprotobufソースファイルを指定しますdist_noinst_DATA
。.tar.gz
これは、 で作成されたソース配布ファイルに確実にバンドルされるようにするために必要make dist
です。
dist_noinst_DATA = whatever.proto
@builddir@
(注: autoconf/automake の新しいバージョンでは、代わりに使用する必要がある場合があります$(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)
これはうまくいくようです:
configure.ac:
AC_ARG_WITH([protobuf-libdir],
[AS_HELP_STRING([--with-protobuf-libdir=LIB_DIR],
[location of the protocol buffers libraries, defaults to /usr/lib])],
[PROTOBUF_LIBDIR="$withval"],
[PROTOBUF_LIBDIR='/usr/lib'])
AC_SUBST([PROTOBUF_LIBDIR])
LDFLAGS="$LDFLAGS -L$PROTOBUF_LIBDIR"
AC_CHECK_LIB([protobuf], [main], [], [AC_MSG_ERROR([cannot find protobuf library])])
AC_ARG_WITH([protoc],
[AS_HELP_STRING([--with-protoc=PATH],
[location of the protoc protocol buffer compiler binary, defaults to protoc])],
[PROTOC="$withval"],
[PROTOC='protoc'])
AC_SUBST([PROTOC])
Makefile.am:
%.pb.cc %.pb.h: %.proto
$(PROTOC) --proto_path=$(dir $^) --cpp_out=$(dir $^) $^
次に、.pb.cc ファイルを SOURCES に追加します。