Jak korzystać z buforów protokołów z autoconf/automake?

Szukasz dobrego przykładu reguł autoconf i automake do budowania projektu wykorzystującego bufory protokołów, najlepszego sposobu na dodanie protokołu do procesu budowania?

Author: Aaron, 2012-12-18

2 answers

configure.ac

Jeśli chodzi o bibliotekę protobuf, używa ona pkg-config, więc prawdopodobnie najlepiej odnieść się do niej używając makra PKG_CHECK_MODULES:

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

I sprawdź polecenie protoc w ścieżce. Oto bardzo podstawowe sprawdzenie, czy jest na ścieżce:

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

Alternatywnie, pozwól użytkownikowi określić inną protoc za pomocą --with-protoc=/path/to/protoc lub za pomocą zmiennej środowiskowej 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

Dodaj regułę do budowania plików proto:

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

Sprecyzuj pliki źródłowe protobuf z dist_noinst_DATA. Jest to konieczne, aby upewnić się, że zostaną one dołączone do pliku źródłowego .tar.gz stworzonego za pomocą make dist.

dist_noinst_DATA = whatever.proto

(Uwaga: w przypadku nowszych wersji autoconf / automake może być konieczne użycie @builddir@ zamiast $(builddir).)

Określ wygenerowane pliki z prefiksem nodist_ i ścieżką $(builddir):

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

I czyścić je make clean:

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

Użyj BUILT_SOURCES do obsługi zależności dla Wbudowanych plików nagłówkowych:

BUILT_SOURCES = whatever.pb.h

Flagi kompilatora aby znaleźć plik nagłówka (do pracy w kompilacjach VPATH), może być konieczne odwołanie się do katalogu kompilacji:

AM_CPPFLAGS += -I$(builddir)
 13
Author: Craig McQueen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-31 00:48:49

To chyba działa:

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 $^) $^

A następnie dodać .pb.cc pliki do źródeł.

 7
Author: Aaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-19 00:31:59