0

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)

次に、次の 2 行をスクリプトに追加することにしました。

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

なぜその変更を加えて満足しないのかと思うかもしれません。問題は、「lib@PACKAGE_NAME@_protobuf_xxx」を処理するプログラムに Makefile.am が渡されることです。だから私は物事を機能させる方法を見つけなければなりません!私の疑いは、「notdir」関数を使用しても、変数「MY_PB_FILES」が意図したとおりに展開されないということです。

私は GNU Makefile に精通しているわけではないので、提案や助けをいただければ幸いです。

4

1 に答える 1

0

目標は、読み取り専用ディレクトリにあるいくつかのプロトコル バッファ ファイルから C++ ライブラリを作成することです。

$(top_builddir)この問題を回避するためにそれらをコピーすることはできませんか?

書き込み許可を回避するために、Makefile ディレクトリに C++ ファイルを生成したいと考えています。

なのでこちらも入り$(top_builddir)ます。

おそらく、プロトコル バッファ コンパイラをセットアップし、さらに重要なことに 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ますか?

于 2013-07-07T22:43:58.993 に答える