8

他のすべての C++ ファイルが依存する生成ファイルを含む C++ プロジェクトがあります。他のコンパイルが始まる前に、そのファイルを強制的に生成してコンパイルしようとしています。通常、そのファイルを最初にターゲットに配置するのと同じくらい簡単ですall:が、複雑なのは、私の Makefile もビルド システムによって生成され、Makefile にフラグメントを追加することしかできず、一般的に編集することはできません。

それで、依存関係などを介して、生成されたファイルターゲットを最初に強制的に実行する方法はありますか? 私はこのようなものを使用することを考えました:

cpp_files := $(wildcard src/*.cpp)
$(cpp_files): generated_file.cpp
generated_file.cpp:
    # generate the file here

しかし、うまくいかないようです。参考までに、私のソース ディレクトリ構造は次のようになっているため、cpp ファイルを再帰的に収集する必要があります。

src/
|---file1.cpp
|---file2.cpp
|---subdir1/
    |---file3.cpp

gen/
|---generated_file.cpp
4

2 に答える 2

21

それが本当にあなたが望むものであると確信しているなら、それを行う1つの方法があります.makefileがinclude.

.PHONY: dummy
dummy:
    # generate the file here

-include dummy

指定したターゲットに関係なく、Make は最初にdummyルールを実行してから再起動します。

于 2012-05-23T20:47:35.747 に答える
4

実際、他のcppファイルは生成されたファイルに依存していません (Make ルールに関して)。依存関係グラフは次のようになります。

program
 |
 ^- file1.o
 |   ^- file1.c
 |
 ^- file2.o
 |   ^- file2.c
 |
 ^- generated_file.o
     ^- generated_file.c
         ^- <generator prerequisites>

ソース ファイルは、生成された何らかの種類のヘッダー ファイルにのみ依存する可能性があります (#includeこれらのソースによって d が作成された場合)。

ファイルのみを生成する必要がある場合cppは、次の makefile で十分です。

srcs := $(wildcard src/*.cpp src/*/*.cpp)

gen_file := gen/generated_file.cpp
srcs += $(gen_file)

objs := $(srcs:.cpp=.o)

.PHONY : all
all : program

program : $(objs)
    @$(LD) ...

%.o : %.c
    @$(CC) ...

$(gen_file) :
    # generate the file here

アップデート。

Beta's answerに基づく少しの改善。

-include generator-task
.PHONY : generator-task

generator-task : $(gen_files)

$(gen_files) : $(gen_prerequisites)
    # generate the file here

Make の呼び出しごとにジェネレーターを実行する代わりに、前提条件の 1 つが変更された場合にのみファイルを再生成します。

于 2012-05-23T19:41:11.417 に答える