2016-10-27 22 views
0

すべてのコードファイルがサブディレクトリcode/にあるように私のプロジェクトを編成しました。メインディレクトリに1つ、サブディレクトリにcode/という2つのMakefileがあります。ファイルが作成されるフォルダをMakefileに設定するにはどうすればよいですか?

メインディレクトリ内のMakefileが(that postに小道具を)含まれています。私は今、メインからmakeを実行している場合は

exe: $(OBJECTS) 
    $(CC) $(CFLAGS) -o [email protected] $^ -fopenmp -lpng 

%.o: %.c 
    $(CC) $(CFLAGS) -c $< 

code/サブディレクトリに

# .PHONY rule means that project_code is not a file that needs to be built 
.PHONY: project_code 

project_code: 
    $(MAKE) -C $(CODE_DIR) 

clean: 
    $(MAKE) -C $(CODE_DIR) clean 

all: exe 

Makefileはのようなものが含まれていますディレクトリのexeファイルはcode/サブディレクトリに作成されますが、メインディレクトリに置いておきたいと思います。私の質問:これをどのように達成できますか?

答えて

1

この例をrefferてください:

#Name of outpu binary (exe) file; 
PROGRAM_NAME := prog 

# project dirs 
export SRC_DIRS  := ./src1 ./src2 
export INCLUDE_DIRS := ./include 

#list of source files (with whitespace between them) 
SRC_FILES := $(foreach dirname, $(SRC_DIRS), $(wildcard $(dirname)/*.c)) 

#Object files 
OBJ_FILES := $(foreach filename, $(SRC_FILES), $(filename:.c=.o)) 

# Include flags 
LOCAL_INCLUDES=$(foreach dirs, $(INCLUDE_DIRS), -I$(dirs)) 


# list of lib-flags for compiler. For example for math.h use -lm 
#LIB_FLAGS=-lm 
CC=gcc 
CFLAGS=-Wall $(LIB_FLAGS) $(LOCAL_INCLUDES) 

#build executable file 
$(PROGRAM_NAME): $(OBJ_FILES) 
     @echo "Build executable" 
     @$(CC) $(CFLAGS) -o [email protected] $^ 

# compile all object file 
%.o: %.c 
     @echo "Compile $(notdir $<)" 
     @$(CC) -c $(CFLAGS) $< -o [email protected] 

#clean all 
clean: 
     @rm -f $(OBJ_FILES) $(PROGRAM_NAME) 

それだけで1 Makefileを持っています。リストされたディレクトリからソースを取り出し、同じディレクトリにあるオブジェクトを作成し、現在の(上の)dirのバイナリにリンクします

+0

最初は 'export ...'を理解できませんし、 '@ $(CC) '' $(CC) 'の代わりに....?しかし、あなたは間違いなく私を助けました、それは私が必要なインスピレーションでした! – Alf

+1

'export'は通常、一つのmakeが他のMakefileから呼び出される大きなビルドシステムで使われます。 'export'はすべてのネストされたmake呼び出しで変数を利用できるようにします。ターゲットの '@' beforeコマンドは、コマンドの 'echo'(デフォルトではprintコマンドを実行前に行い、 '@'はこのプリントをオフにします) –

+0

明確な説明のためにありがとう:) – Alf

関連する問題