学习 笔记
- 函数调用
$(function arguments)
$(wildcard PATTERN)
当前目录下匹配模式的文件
例如:src=$(wildcard *.c)
$(patsubst PATTERN,REPLACEMENT,TEXT)
模式替换函数
例如:$(patsubst %.c,%.o,$src)
等价于$(src:.c=.o)
shell函数
执行shell命令
例如:$(shell ls -l)
例
二级目录编译链接
.PHONY:clean
CC = gcc
CFLAGS = -Wall -g
BIN = main
SUBDIR = $(shell ls -d */)
ROOTSRC = $(wildcard *.c)
ROOTOBJ = $(ROOTSRC:%.c=%.o)
SUBSRC = $(shell find $(SUBDIR) -name '*.c')
SUBOBJ = $(SUBSRC:%.c=%.o)
$(BIN):$(ROOTSRC) $(SUBOBJ)
$(CC) $(CFLAGS) -c -o $(BIN) $(ROOTOBJ) $(SUBOBJ)
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)
- 多级目录Makefile
父目录
SUBDIRS = test1 test2
.PHONY:default all clean $(SUBDIRS)
default:all
all clean:
$(MAKE) $(SUBDIRS) TARGET=$@
$(SUBDIRS):
$(MAKE) -C $@ $(TARGET)
test1/Makefile
CC = gcc
BIN = test1
OBJS = test1.o
.PHONY: all clean print
all:print $(BIN)
print:
@echo "----make all in $(PWD) ----"
$(BIN):$(OBJS)
$(CC) $(OBJS) -o $@
%.o:%.c
$(CC) -c $<
clean:
@echo "----make clean in $(PWD) ----"
rm -f $(BIN) $(OBJS)
test2/Makefile
CXX = g++
BIN = test2
OBJS = test2.o
.PHONY: all clean print
all:print $(BIN)
print:
@echo "----make all in $(PWD) ----"
$(BIN):$(OBJS)
$(CXX) $(OBJS) -o $@
%.o:%.cpp
$(CXX) -c $<
clean:
@echo "----make clean in $(PWD) ----"
rm -f $(BIN) $(OBJS)