Makefile学习(三)[第二版]

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~



原文地址:https://www.cnblogs.com/jzssuanfa/p/6845077.html