0

C++ プロジェクトのソース ファイルを生成するスクリプトがあります。スクリプト自体は次のようになります。

echo "total args: $#"
if [ $# -eq 7 ]; then
echo "in if"
$1/../tools/xsde [...]
fi

ターゲット smt_response_files が実行され、ファイル .xsd.files.make が存在しないか、.xsd ファイルよりも古い場合、makefile から実行されます。

$(smt_path) ?= .
$(smt_build) ?= $(smt_path)/build
$(common_build) ?= ../build

-include $(smt_build)/$(smt_gen_response_xsd).files.make

smt_response_files : | $(smt_build)/$(smt_gen_response_xsd).files.make
    @:

$(smt_build)/$(smt_gen_response_xsd).files.make : $(smt_gen_response_path)/$(smt_gen_response_xsd)
    @$(common_build)/generate_xml.sh $(smt_path) $(smt_gen_response_path) $(smt_gen_response_xsd) xml::$(smt_gen_response_class) make_list $(smt_build)/$(smt_gen_response_xsd).files.make smt_response_files

問題: プロジェクトをクリーンアップして *.xsd.files.make を削除すると、makefile が解析されるときにそれらが再作成されます (ロシア語からの出力を翻訳しました)。

Reading make-files...
total args: 7
in if
...
total: 2193
Updating makefile goals...
 File `smt_clean' does not exist.
... (and a normal clean proccess goes next)

自動生成されたファイルは clean ターゲットによって削除されますが、その過程で作成されるのは好きではありません。

私の知る限り、これを行う唯一の方法は、メイクファイルとして含まれている *.xsd.files.make を再作成するためのルールを除外することです。

inc_gen ?= true
ifeq ($(MAKECMDGOALS),clean)
    inc_gen := false
endif
# ... other excluded targets here (smt_clean, etc.)

ifeq ($(inc_gen),true)
$(smt_build)/$(smt_gen_response_xsd).files.make : $(smt_gen_response_path)/$(smt_gen_response_xsd)
    @$(common_build)/generate_xml.sh $(smt_path) $(smt_gen_response_path) $(smt_gen_response_xsd) xml::$(smt_gen_response_class) make_list $(smt_build)/$(smt_gen_response_xsd).files.make smt_response_files
endif

私の問題を解決する他の方法はありますか?たぶん、より一般的なアプローチが存在しますか?

よろしくお願いします。

4

1 に答える 1

0

メイクファイルが解析されるため、技術的にはビルドされません。GNU make マニュアルのセクションHow Makefiles are Remadeを参照してください。make がすべての makefile の解析を完了すると、含まれているすべての makefile が最新であることを確認するパスが実行されます。これは、それらすべてがターゲットであるかのように扱われ、再構築が試行されます。それがあなたが見ているものです。

makefile が変更された場合、make は自分自身を最初から再実行するため、更新された makefile の内容を再度読み取ることができます。

あなたが持っている解決策(cleanターゲット、およびmakefileの再構築を強制したくないその他のターゲットをチェックする場所、およびそれが見つかった場合は、を実行しないか、include再構築するためのルールを提供しないmakefile) が推奨されるソリューションです。

、 などの規則は単なる慣例でcleanあることを忘れないでください。そのため、make はそれらを特別に扱うことを知ることができません。allfoobar

于 2013-06-04T11:11:27.757 に答える