0

Linux で C++ プロジェクトを使用しています。GNU make と GCC を使用しています

次のルールがあります。

all: ... 
version:
config:
  rm -f config.h
  @$(MAKE) --no-print-directory config.h
config.h:
 # ..... create the file config.h here

make version はビルド番号を増やします。1.1-123、次に 1.2-124 ... など。 バージョンは config.h ファイルに記述されており、config.h はプロジェクト内のすべてのファイルに含まれています。

現在、config.h は次のいずれかの場合に再構築されるという考えがあります: - プログラムのバージョンをリリースするとき (単なる開発/テストではなく) - それが存在しないとき

だから私はこの依存関係を作りたくありません:

all: config
config: version

変更されたファイルだけでなく、すべてのメイクで構成ファイルが再構築され、すべてのファイルが再コンパイルされるためです。そのため、開発中に構成ファイルを再構築したくありませんが、今すぐ再構築する場合に限りmake release_version ます。そのルールは次のとおりです。

release_version: config version all

問題はmake release_version -j 3、3 つのターゲット (config、version、all) すべてを同時に作成することです。これは、バージョンが config.h の作成の準備ができていない可能性があることを意味し、config.h の準備ができていない可能性があることを意味します。all. したがって、この依存関係を作成する必要があります。

release_version: すべて すべて: 構成 構成: バージョン

make release_versionただし、が実行された場合のみ。make allこれらの依存関係を持ちたくありません。

多分私は次のようなものが必要です:

release_version: version_release config_release all_release

all_release: 構成 config_release: 構成 version_release: バージョン

4

2 に答える 2

1

あなたの例は少しでたらめです。あなたが持っているものを読み直して、それを明確にすると良いでしょう。ターゲットは何をしversionますか?versionとの関係は何configですか? release_versionあなたがどこにも示していないこれとconfigとの関係は何versionですか?

私が正しく理解している場合はall、 の既存のバージョンを使用してコードをビルドするルールconfig.h(存在しない場合は作成する) と、release_versionを更新するルールがconfig.h必要であり、コードを のようにビルドしますall。私は何versionをすべきかconfigわからない。

何か不足していない限り、次のようにすることができます。

all: ...

release_version:
        @rm -f config.h
        @$(MAKE) config.h
        @$(MAKE) all

config.h:
        ...create config.h...

.PHONY: all release_version

他にもたくさんのオプションがあります。

于 2013-05-10T17:57:33.563 に答える