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 に精通しているわけではないので、提案や助けをいただければ幸いです。