2011-06-28 8 views
2

あなたの小さなC/C++プロジェクトは、あなたのコードをすべて1つのファイルにまとめることが現実的ではない段階に達しました。いくつかのコンポーネントを分割する必要があります。だからsrc/ディレクトリを作成して、実際のMakefileを書かなければなりません。 hello: hello.o以上のものああ... ... [email protected]または$<または$^でしたか?クラップあなたは覚えていない(私は決してしない)。Canonical 'simple project'メイクファイル

簡単なソースツリーを扱うことができる単純なMakefileがありますか?もしそうなら、その中には何があり、それはなぜですか?私はファイルを追加するたびにMakefileを編集しなくても、Cファイルでいっぱいのディレクトリをコンパイルできる、もっとも小さくてシンプルなMakefileを探しています。ここで私がこれまで持っているものです。

CXX = clang++ 
CXXFLAGS = ... 
LDFLAGS = ... 
EXENAME = main 

SRCS = $(wildcard src/*.cc) 
OBJS = $(patsubst src%.cc,build%.o, $(SRCS)) 

all: $(EXENAME) 

build/%.o: src/%.cc 
    @mkdir -p $(dir [email protected]) 
    $(CXX) -c -o [email protected] $^ $(CXXFLAGS) 

$(EXENAME): $(OBJS) 
    $(CXX) -o [email protected] $^ $(LDFLAGS) 

clean: 
    rm -rf $(EXENAME) build/ 

このMakefileは、build/ディレクトリ内のファイルに.osrc/ディレクトリ内のすべての.ccファイルを構築する、親ディレクトリにそれらをリンクします。

あなたはどうしたらいいですか?

+1

私はcmakeを使います。ヘッダーファイルが2つあると、Makefileを直接保守するだけではスケールアップできません。オートツールはかさばりすぎて、あまりにも多くのステップを必要とします。 Cmakeは真のワンサイズのツールです。 –

+0

私は間違いなくcmakeを〜10個以上のファイルに使用します。それはそれよりも小さいもののためにちょっと重いようです。 – nornagon

+0

それは意外にも重大ではなく、本当に必要な作業量だけです。最初の呼び出しの後、CMakeファイルを変更したとしても、 'make'を呼び出すだけです。依存関係を理解する方法は非常に魔法です:-)(しかし、そうですね、あなたはあまりにも小さな状況のためにあまりにも多くを見つけるかもしれない構造) –

答えて

1

明示的な情報源のリストを持たないことを再確認します。長期的には問題が発生する可能性があります。しかし、それがあなたの決定なら、このメイクファイルはかなり良いです。後であなたが

build/foo.o: bar.h 

のような依存関係を追加することができますし、準備ができたら、あなたはAdvanced Auto-Dependency Generationを見てみることができるように

%.oルールでは、私は、代わりに$^$<使用します。

+0

なぜそれが私を困らせるのでしょうか? – nornagon

+0

@nornagon:いくつかのコードを共通に持つ2つ(またはそれ以上)の異なる実行可能ファイルを持つことは、しばしば役に立ちます。非共通コードを解凍しておくと、メークファイル内の明示的なソースリスト、または依存関係グラフを反映するディレクトリ構造が必要になります。前者は通常より簡単です。しかし、この問題に遭遇した場合、あるスキームから別のスキームに移行するのは簡単です。 – Beta

0

私はCMakeを使ったことが一度もなかったので、それについては何も言えません。私が提供できる最高のものは、学校で「makemake」と呼ばれるプログラムで、Makefilesを自動的に作成します。http://www.cs.rit.edu/~swm/makemake/これは高度なプログラムではありませんが、それは完了です。プラス面では、非常に使いやすいです。単にディレクトリ内の 'Makefile'を実行するだけで、そのディレクトリ(CおよびC++)内のすべてのソースファイルをビルドしてリンクするMakefileがあります。明るい面では、さらにファイルを追加すると、makemakeをもう一度実行するだけで、新しいmakefileが作成されます。欠点としては、作成したメークファイルから次のメークファイルに行ったカスタムターゲットをそのままにする方法はありません。

'one size fits all' makefileは、間違いなくそれを行うことができますが、最初に 'make'コマンドの目的をはずします。これはファイルを最後に変更した時刻を記録し、最近変更されたファイルだけを再コンパイルするか、または変更したヘッダファイルに依存します(ただし、正しいものを生成するには 'makedepend' - http://www.x.org/archive/X11R7.5/doc/man/man1/makedepend.1.html)。自己更新メークファイルを作るために、現在持っているものとmakedependを併用することができます。

-1

automakeツールを使用します。変更が簡単で、開発者に負担がかかりません。 SOURCES、LDLIBS、LDFLAGSを変数として指定するだけで簡単です。最初はちょっと変わったように思えるかもしれません。しかし、あなたがそれ以上のことをすると、それはあなたのお気に入りになります。

+2

私は復讐でオートツールが嫌いです。また、6ファイルのプロジェクトでは* way *の過剰使用です。 – nornagon

+1

ほとんどの時間のために私はautotoolsが嫌いです。私は自分のプログラム自体でSLOCよりautotoolsの* generated *ファイルにもっと多くのSLOCを持っています。それはまったく不均衡でばかげている。 –