make经常使用内嵌函数
1、函数调用
$(function arguments) #$引用的结果就是函数生成的结果
2、Makefile下经常使用的函数
1)$(wildcard PATTERN) #匹配当前文件夹下的文件
比如:src=$(wildcard *.c) #匹配当前文件夹下全部的.c文件
2)$(patsubst PATTERN,REPLACEMENT,TEXT) #模式替换函数
比如:$(patsubst %.c,%.o,$src) #等价于$(src:%.c=%.o)[经常使用]
3)shell函数,运行shell命令
比如:$(shell ls –d */)
多级文件夹Makefile
#演示样例1-全部的编译均由主文件夹下的Makefile完毕
CC = gcc
CFLAGS = -Wall -g
BIN = main
SUBDIR = $(shell ls -d */) #SUBDIR保存了当前文件夹下的子文件夹
ROOTSRC = $(wildcard *.c) #ROOTSRC保存了当前文件夹下的.c文件
ROOTOBJ = $(ROOTSRC:%.c=%.o) #ROOTOBJ保存了将ROOTSRC中.c替换为.o文件之后的结果
SUBSRC = $(shell find $(SUBDIR) -name '*.c') #SUBSRC保存了全部子文件夹下的全部.c文件
SUBOBJ = $(SUBSRC:%.c=%.o) #SUBOBJ保存了将SUBSRC中.c替换为.o文件之后的结果
$(BIN):$(ROOTOBJ) $(SUBOBJ)
$(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ)
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@ #将全部的.c生成.o文件
clean:
rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)
#演示样例2-各个子文件夹下都有想相应的Makefile文件,各个子文件夹负责相应的编译工作
DIRS = lib intro sockets advio daemons datafiles db environ
fileio filedir ipc1 ipc2 proc pty relation signals standards
stdio termios threadctl threads printer exercises
all:
for i in $(DIRS); do
(cd $$i && echo "making $$i" && $(MAKE) ) || exit 1;
done
clean:
for i in $(DIRS); do
(cd $$i && echo "cleaning $$i" && $(MAKE) clean) || exit 1;
done
生成分布在多个文件夹下的可运行文件
#每一个子文件夹都须要生成一个可运行文件,当前文件夹的结构例如以下图
#各个文件的内容例如以下
//test1/test1.c #include <stdio.h> int main() { printf("Hello ! "); return 0; }
#test1/Makefile
.PHONY: all clean print
CC = gcc
CFLAGS = -Wall -g
BIN = test1
SOURCES = $(wildcard *.c)
OBJECTS = $(SOURCES:%.c=%.o)
all: print $(BIN)
print:
@echo "----- make all in $(PWD) -----"
$(BIN): $(OBJECTS)
$(CC) $(CFLAGS) -o $@ $^
#$(OBJECTS): $(SOURCES)
%.o: %.c
$(CC) $(CFLAGS) -o $@ -c $<
clean:
@echo "---- make clean in $(PWD) -----"
-rm -rf $(BIN) $(OBJECTS)
//test2/test2.cpp #include <iostream> using namespace std; int main(void) { cout << "World!" << endl; }
#test2/Makefile
.PHONY: clean all print
CXX = g++
CPPFLAGS = -Wall -g
BIN = test2
SOURCES = $(wildcard *.cpp)
OBJECTS = $(SOURCES:.cpp=.o)
all: print $(BIN)
print:
@echo "----- make all in $(PWD) -----"
$(BIN): $(OBJECTS)
$(CXX) $(CPPFLAGS) -o $@ $<
%.o: %.cpp #能够省略该行以及以下一行
$(CXX) $(CPPFLAGS) -o $@ -c $<
clean:
@echo "----- make clean in $(PWD) -----"
-rm -rf $(BIN) $(OBJECTS)
#Makefile-在主文件夹下
SUBDIR = $(shell /bin/ls -d */)
.PHONY: default all clean $(SUBDIR)
default: all
all clean:
$(MAKE) $(SUBDIR) TARGET=$@
$(SUBDIR):
$(MAKE) -C $@ $(TARGET)
#运行make之后的结果
#运行后的文件夹结构图
增添了好多文件[.o 和 可运行文件]
#运行make clean的结果
#运行之后的结构图
恢复原样O(∩_∩)O~