簡単なMakefile、Linuxの上でペンの試験問題を練習することを補助します


##############################################################################
#簡易マルチモジュールプログラム自動コンパイル/パージMakefile
#profile:自動コンパイル、クリア機能、毎回コンパイルしてgcc或いはrm指令を入力する必要がない
#使用方法:$make[OBJ=obj 1.suffix[:obj 2[:...]]][TARGET=tool] [clean]
#
#使用説明:make命令を実行すると$(SRC)/obj 1がコンパイル/クリアされます.suffix $(SRC)/obj2.suffix ... 
#make exec命令の場合、実行可能プログラム$(BIN)/toolを生成
#make gdb命令の場合、デバッガデバッグ実行可能プログラム$(BIN)/toolを起動
#TARGETを指定しない場合は、出力実行可能プログラム名としてobj 1(最初のOBJのプレフィックス名)がデフォルトで使用されます.
#
#注意事項:1.Makefileはパスをチェックしません.指定したパスが有効であることを確認してください.
#
#例:1.$make OBJ=main.c:lib1:lib2 TARGET=tool
#は$(SRC)/mainをコンパイルします.c $(SRC)/lib1.c $(SRC)/lib2.c 3つのファイル
#生成$(BIN)/main.o $(BIN)/lib1.o $(BIN)/lib2.oターゲットプログラム、
#3つのターゲットプログラムに接続して実行可能プログラム$(BIN)/toolを生成
#
#          2.$make OBJ=main.c:lib1:lib2 TARGET=tool clean
#は$(BIN)/mainをクリアします.o $(BIN)/lib1.o $(BIN)/lib2.oおよび$(BIN)/tool
#
#          Author: WKF4058, Date: 2013/12/30
#変更履歴:
#2014-1-9:2個のコンパイルプロセスの中間出力ファイルを追加する:前処理.i,コンパイル.s
###############################################################
#コンパイラの指定
CC = gcc
CXX = g++
#デフォルトのソース接尾辞名を指定
SUFFIX = .c
#デバッガの指定
GDB = `which gdb`
#コンパイルパラメータgdbデバッグ情報の指定
CFLAGS = -g
#対象プログラム名、複数OBJ対応、複数OBJ使用:分割、make指令後接パラメータ指定OBJ
例えば最も簡単なコンパイルtest.cは[user@thinkpad]$ make OBJ=test.c
OBJ = test.c
#実行可能ファイル名、指定しない場合、デフォルトは最初のターゲット・プログラムの接頭辞と同じ名前で、接尾辞名はありません
TARGET =
#出力先プログラムディレクトリ、最後の/書き込み不可
BIN = ./bin
#ソースファイルディレクトリ、最後の/書き込み可能/書き込み不可
SRC = ./src
#ファイルを含む検索パスをカスタマイズ:分割、最後の/書き込み不可
VPATH += ./:./include
##############################################################################
############################################################
#BINが空の場合、BINを現在のディレクトリとして指定します.
ifeq ($(BIN),)
BIN := ./
endif
#パラメータが最初のターゲットの接尾辞名を指定した場合は、その接尾辞名をソースの接尾辞名として使用します.
ifeq ($(suffix $(word 1,$(OBJ))), )
else
SUFFIX := $(suffix $(word 1, $(OBJ)))
endif
#ソースコードに基づいてコンパイラをリセット
ifeq ($(SUFFIX),.cpp)
 CC := $(CXX)
endif
ifeq ($(SUFFIX),.cc)
 CC := $(CXX)
endif
#パスの後ろにある斜線を削除し、パスシーケンスに変換
VPATH := $(patsubst %/,%,$(subst :,$(VPATH)))
BIN := $(patsubst %/,%,$(BIN))
#ファイルを含む検索パスの設定
CFLAGS += $(addprefix -I,$(VPATH))
#SRCが空の場合は、SRCを現在のディレクトリとして指定します.
ifeq ($(SRC),)
SRC := ./
endif
#パッチワーク目標プログラム名
override OBJ := $(addsuffix .o,$(subst :,$(basename $(OBJ))))
#実行可能プログラム名が指定されていない場合、または空のTARGETが指定されていない場合は、実行可能プログラム名として最初のOBJのプレフィックス名を使用します.
ifeq ($(TARGET),)
override TARGET := $(basename $(firstword $(OBJ)))
endif
#Makefile総入口
all: $(BIN)/$(TARGET)
#すべてのターゲットプログラムを接続し、実行可能プログラムを生成する
$(BIN)/$(TARGET): $(addprefix $(BIN)/,$(OBJ))
$(CC) $(CFLAGS) $+ -o $@
#指定された各ターゲットプログラムを個別にステップ別にコンパイル
$(addprefix $(BIN)/,$(OBJ)): $(BIN)/%.o : $(SRC)/%$(SUFFIX)
$(CC) -E $(CFLAGS) $< -o $(patsubst %.o,%.i,$@)
$(CC) -S $(CFLAGS) $(patsubst %.o,%.i,$@) -o $(patsubst %.o,%.s,$@)
$(CC) -c $(CFLAGS) $(patsubst %.o,%.s,$@) -o $@
#実行可能プログラムの実行
exec:
$(BIN)/$(TARGET)
#デバッグ実行可能プログラム
gdb:
$(GDB) $(BIN)/$(TARGET)
#コンパイル結果の消去
clean:
@echo Cleaning build...
rm -rf $(BIN)/$(TARGET) $(addprefix $(BIN)/,$(OBJ))
rm -rf $(patsubst %.o,$(BIN)/%.i,$(OBJ)) $(patsubst %.o,$(BIN)/%.s,$(OBJ))
##########################END#################################################