2012-02-07 5 views
14

ビンとコードファイルを別々のディレクトリに分割して、現在の状態で管理するのが難しくなってしまいたいと考えています。Makefileはソースコードとバイナリのために別々のディレクトリをどのように使用できますか?

私は、理想的には(すべてのプログラムがあることを心に留めて、私はこれは手作業ですべてのプログラムのためのルールを記述することなく、私の現在のシステムで動作するように取得することができませんしかし

project_dir 
|-Makefile 
|-run_tests.sh 
| 
|__source 
| |-program1.cpp 
| |-program2.cpp 
| 
|__bin 
    |-program1 
    |-program2 

を持っていると思います別のプログラムではなく、一緒にリンクされたオブジェクトのシリーズ)

#Current make system 
BIN=./bin/ 
SOURCE=./source/ 

LIST=program1 program2... 

all: $(LIST) 

%: $(SOURCE)%.cpp 
    $(CC) $(INC) $< $(CFLAGS) -o $(BIN)[email protected] $(LIBS) 

それは常にバイナリを再構築すると思うので、それはソースファイルがいない場合でも、現在のパスにターゲットを見ることができない私、これはそれ以外作品かわった。

私の唯一の考えは、メイクファイルを作るプログラムを書くことですが、私はそれをしたくありません。使用automake

+0

伝統的なアプローチは、ソースディレクトリ 'src'を呼び出してバイナリをビルドし、バイナリが' bin'ディレクトリにコピーされる別のステップ 'install'を持っています - それを行うためにインストールします。 – reinierpost

答えて

17

あなたはほとんどありました...

#Current make system 
BIN=./bin/ 
SOURCE=./source/ 

LIST=$(BIN)/program1 $(BIN)/program2... 

all: $(LIST) 

$(BIN)/%: $(SOURCE)%.cpp 
    $(CC) $(INC) $< $(CFLAGS) -o [email protected] $(LIBS) 

はまた、次の

PROG=program1 program2 
LIST=$(addprefix $(BIN)/, $(PROG)) 
+0

おそらくダミーの質問かもしれませんが、コマンドラインで '%'変数(つまり、lessディレクトリ)を使用する方法はありますか? "gcc blah blah -D%"(プログラムがそれ自身の名前を知っているので) – 111111

+2

はい、 '$ *'を使ってステムを得ることができます。 –

+0

優秀私はmakeファイルが完了したと思います。 – 111111

1

簡単な解決策を使用することによりLIST容易に行うことができます。

手動で行う場合は、vpathディレクティブまたはVPATH環境変数を使用する必要があります。 GNU makeマニュアルの内容はa sectionです。 Makefileを直接binディレクトリに置き、VPATHをソースディレクトリに設定すると、暗黙のルールが再び有効になります。

+1

よく作られたmakeファイルで行うことができれば、automakeのファンではありません。 – 111111

1

ここには、Makefileの完全な準備完了バージョンがあります。

.oファイルのための次のディレクトリ

でフォルダを準備した.cppファイル用/build/ を:バイナリファイルの/src/ を:/bin/

その後/

CC   = g++ 
LD   = g++ 
CFLAG  = -Wall 
PROG_NAME = prog 

SRC_DIR  = ./src 
BUILD_DIR = ./build 
BIN_DIR  = ./bin 
SRC_LIST = $(wildcard $(SRC_DIR)/*.cpp) 
OBJ_LIST = $(BUILD_DIR)/$(notdir $(SRC_LIST:.cpp=.o)) 

.PHONY: all clean $(PROG_NAME) compile 

all: $(PROG_NAME) 

compile: 
    $(CC) -c $(CFLAG) $(SRC_LIST) -o $(OBJ_LIST) 

$(PROG_NAME): compile 
    $(LD) $(OBJ_LIST) -o $(BIN_DIR)/[email protected] 

clean: 
    rm -f $(BIN_DIR)/$(PROG_NAME) $(BUILD_DIR)/*.o 
で次のMakefileを使用します

コンパイルするたびに最終的なプログラム名は/bin/のprogとなりますコード、バイナリは/build/に区切られているので、ソースコードディレクトリはきれいできれいになります。

関連する問題