对于当前目录结构下的Makefile(基于图书管理系统)
.
├── Makefile
├── README.md
├── bin
│ ├── adminsys
│ └── usersys
├── build
│ ├── adminmain.o
│ ├── generalcore.o
│ ├── generalimpl.o
│ ├── generalview.o
│ ├── logincore.o
│ ├── loginimpl.o
│ ├── loginview.o
│ ├── read.o
│ ├── supercore.o
│ ├── superimpl.o
│ ├── superview.o
│ ├── usercore.o
│ ├── userimpl.o
│ ├── usermain.o
│ └── userview.o
├── data
│ ├── book.dat
│ ├── general.dat
│ ├── gid.dat
│ ├── no.dat
│ ├── super.dat
│ ├── uid.dat
│ └── user.dat
├── include
│ ├── book.h
│ ├── generaladmin.h
│ ├── generalcore.h
│ ├── generalimpl.h
│ ├── generalview.h
│ ├── logincore.h
│ ├── loginimpl.h
│ ├── loginview.h
│ ├── read.h
│ ├── superadmin.h
│ ├── supercore.h
│ ├── superimpl.h
│ ├── superview.h
│ ├── user.h
│ ├── usercore.h
│ ├── userimpl.h
│ └── userview.h
└── src
├── admin
│ ├── Makefile
│ ├── adminmain.c
│ ├── generalcore.c
│ ├── generalimpl.c
│ ├── generalview.c
│ ├── logincore.c
│ ├── loginimpl.c
│ ├── loginview.c
│ ├── read.c
│ ├── supercore.c
│ ├── superimpl.c
│ └── superview.c
└── user
├── Makefile
├── read.c
├── usercore.c
├── userimpl.c
├── usermain.c
└── userview.c
根目录Makefile
CC = gcc
CFLAGS = -Wall -Werror
# 根目录路径
TOP_DIR = $(PWD)
# TOP_DIR = .
# 存放中间文件的路径
BUILD_DIR = $(TOP_DIR)/build
# 存放可执行文件的路就路径
BIN_DIR = $(TOP_DIR)/bin
# 存放头文件的文件夹
INC_DIR = $(TOP_DIR)/include
# 存放.c 源文件的文件
SRC_DIR := \
$(TOP_DIR)/src/admin \
$(TOP_DIR)/src/user
SRC_ADMIN_DIR := $(TOP_DIR)/src/admin
SRC_USER_DIR := $(TOP_DIR)/src/user
# 在头文件路径前面加上-I
INCLUDE = $(patsubst %, -I %, $(INC_DIR))
VPATH = $(SRC_DIR)
export INCLUDE INC_DIR BIN_DIR BUILD_DIR TOP_DIR CC CFLAGS \
SRC_ADMIN_DIR SRC_USER_DIR
all:CHECKDIR $(VPATH)
CHECKDIR:
@mkdir -p $(BUILD_DIR) $(BIN_DIR)
$(VPATH): RUN
make -C $@
RUN:
.PHONY:clean
clean:
rm -rf $(BUILD_DIR) $(BIN_DIR)
# $(shell echo $(INCLUDE) > a.txt) # 调试
底层目录的Makefile
展示的是./src/admin中的makefile
DIR = $(SRC_ADMIN_DIR)
# 得到带路径的.c 文件
CFILES := $(foreach dir,$(DIR),$(wildcard $(dir)/*.c))
# 得到不带路径的.c 文件
CFILENDIR := $(notdir $(CFILES))
# 将工程中的.c 文件替换成 ./build 目录下对应的目标文件 .o
COBJS = $(patsubst %,$(BUILD_DIR)/%,$(patsubst %c,%o, $(CFILENDIR)))
# 可执行文件名
TARGET = $(patsubst %main.c,%sys,$(notdir $(foreach dir, $(DIR), $(wildcard $(dir)/*main.c))))
# 可执行文件列表
# TARGETLIST = $(patsubst %main.c, %sys, $(TARGET))
$(BIN_DIR)/$(TARGET): $(COBJS)
@echo "$@"
$(CC) $(CFLAGS) -o $@ $^
$(COBJS): $(BUILD_DIR)/%.o: %.c
$(CC) $(CFLAGS) $(INCLUDE) -c -o $@ $^
详细教程有空更新...
标签:SRC,TOP,多级,Makefile,dat,模板,DIR,BUILD From: https://www.cnblogs.com/sleeeeeping/p/18356192