## c/c++ 代碼編譯Makefile
########################正常配置##################################################
##目标檔案
TARGET = server
##安裝目錄
INSTALL_DIR = /opt/
##包含頭檔案路徑
# -I/xx/xx/include
INC_DIR = -I/usr/include/mysql -I/usr/include/libxml2
##依賴庫
LIB_DIR = -L/usr/lib64/mysql
LIB_DEPENDS = -lmysqlclient -lcurl -lxml2
##編譯選項
CFLAGS = -Wall -O -g
# -Wall 輸出所有告警
# -O 在編譯時進行優化
# -g 編譯debug版本
######################################################################################
##編譯器選用
CC = gcc
XX = g++
##wildcard通配符函數,産生一個所有.c .cpp檔案清單
C_SRC = $(wildcard *.c)
CXX_SRC = $(wildcard *.cpp)
##産生一個所有.c .cpp檔案 對應的.o檔案清單
##把所有.c替換成.o
#C_OBJS = $(C_SRC:%.c=%.o)
C_OBJS = $(subst .c,.o,$(C_SRC))
#CXX_OBJS = $(CXX_SRC:%.cpp=%.o)
CXX_OBJS = $(subst .cpp,.o,$(CXX_SRC))
ALL_OBJ = $(C_OBJS) $(CXX_OBJS)
##把所有c檔案編譯生成.o檔案
## $< --第一個依賴檔案;$@ --目标檔案
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@ $(INC_DIR)
##把所有cpp檔案編譯生成.o檔案
%.o:%.cpp
$(XX) $(CFLAGS) -c $< -o $@ $(INC_DIR)
##目标檔案,依賴OBJS中的.o檔案
##all--僞目标,$^--所有依賴檔案
all: $(TARGET)
$(TARGET): $(ALL_OBJ)
$(XX) $^ -o $(TARGET) $(INC_DIR) $(LIB_DIR) $(LIB_DEPENDS)
chmod a+x $(TARGET)
##安裝指令
install: all
mkdir -p $(INSTALL_DIR)
cp -R $(TARGET) $(INSTALL_DIR)
##執行make clean操作
clean:
rm -rf *.o $(TARGET)
##指定哪些是僞目标,作用防止有這樣的檔案存在沖突,導緻makefile不執行
.PHONY: all clean distclean install