1

ソース ファイルのリストを独自のファイル (source.list) に分けて、何かを追加するたびに Makefile を更新する必要がないようにしたいと考えています。

source.list は次のようになります。

a_file.cpp
another_file.cpp
...
xyz_file.cpp

各ファイルを改行で。

そのリストをスペース区切りのリストとして Makefile に入れるにはどうすればよいですか?

必要に応じて、configure bash スクリプトを使用できます。これに awk を使用できることは知っていますが、可能であれば避けたいと思います

4

3 に答える 3

4
SOURCE_LIST := $(shell cat source.list)
于 2013-09-16T13:04:04.250 に答える
0

gmakeで使用$(wildcard *.cpp)

リストを操作する他の関数を使用して、必要に応じて一部のソース ファイルを除外できます。

于 2013-09-16T08:21:41.940 に答える
0

ソースを別のファイルに入れる必要がある場合は、すべての翻訳単位をオブジェクト ファイルにコンパイルするために必要なターゲットの数に応じて、1 つまたは複数の変数を使用できます。

SOURCE_OBJ1 = src1.cpp depends1 depends2 ...
SOURCE_OBJ2 = src2.cpp depends1 depends2 ...
....

それを sources.list に保存し、Makefile の実際のターゲット定義の前に含めます。

include sources.list
 .PHONY: all
 all: executable

 executable: obj1.o obj2.o
    g++ -o executable obj1.o obj2.o

 src1.o: $(SOURCE_OBJ1)
 src2.o: $(SOURCE_OBJ2)

編集: ソース ファイル自体を除いて、1 つ以上の依存関係を持つ複数のターゲットのアプローチを一般化しました。ある時点で、たとえばコンパイルが必要な新しいソース ファイルを追加する場合などに、もう一度 Makefile 自体にアクセスする必要があります。分割されたリストだけでできることは、実際のソース ファイルを切り替えたり、Makefile に触れずにターゲットの依存関係を変更したりすることです。

これは、恐ろしく、スケーリングしないという事実を除いて、すべてうまくいっています。CMake のようなビルド システム ジェネレーターを使用してください。

EDIT2 :すべてに期待される偽のターゲットを追加しました。

EDIT3 : 注意: 上記では、 src1 などをmainなどの実際のソース ファイル名に置き換えることが想定されています。そうしないと、make は適切な g++ コマンド ラインを推測せず、依存関係として言及されているヘッダー ファイルをソース ファイルのリストに追加する可能性があります。その結果、オブジェクト ファイルが使用できなくなります。

別の方法として、ソースと依存関係の両方の変数を指定してから、自分でコンパイラを呼び出す方法を指定できます。

# sources.list
SOURCES_OBJ1 = src1 src2 src3 # only source files here
DEPENDS_OBJ1 = $(SOURCES_OBJ1) dep1 dep2 dep3 # dependencies might include different file types

# ....

# Makefile
# all the other stuff here
obj1.o: $(DEPENDS_OBJ1) # can now be names however you see fit
        g++ -c $(SOURCES_OBJ1) -o obj1.o # handle compiler invocation manually

obj1.o には任意の名前を付けることができ、PHONY ターゲットではないことに注意してください。また、使用されるソース ファイルはターゲットの依存関係のリストの一部でもあることに注意してください。ただし、ソースのみが g++ に渡されてコンパイルされます。

于 2013-09-16T08:29:48.747 に答える