Makefile语法

1.make讲解

make命令执行时,需要一个Makefile文件,Makefile文件告诉make命令需要怎么样编译和 链接程序。Makefile文件指引make工具执行。

2.makefile常见模板

###########  target name
# compile all .c file in $(PWD)
SRCS:=$(wildcard ./*.c)   #通配符会自动展开,获取目录下所有c文件列表
#OBJS := $(SRCS:.c=.o) #?????
OBJS = $(patsubst %.c, %.o, $(SRCS)) #替换通配符
OUT := bpool
OUT_LIB := lib
OUT_SO := so

########### cross compiler and  flags
CC := gcc
CFLAGS:= -g -O0
APP_CFLAGS += $(CFLAGS) -DMAINAPP
LIB_CFLAGS := $(CFLAGS)
SO_CFLAGS:=$(CFLAGS) -shared -fpic
LDFLAGS := -lrt -lpthread

### make file  $(warning ) for debug
#tip1:  .FORCE  NO increment but fully compile whatever target or depend is changed?
#tip2:  $@ $^ target and depends 

#$(warning ####debug: objs=$(OBJS) )
all: $(OUT)

%.o: %.c
    $(warning #### hide rules for single .c OBJS )
    $(CC) $(APP_CFLAGS)  -o $@ -c $^

$(OUT): $(OBJS)
    @echo @@@@@@@ compile $@
    $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

$(OUT_LIB): bufferpool.c
    @echo @@@@@@@ compile test.$@
    $(CC) $(LIB_CFLAGS) -o $(OUT).$@ -c $^

$(OUT_SO): bufferpool.c
    @echo @@@@@@@ compile test.$@
    $(CC) $(SO_CFLAGS) -o $(OUT).$@ -c $^


.PHONY: clean 
clean:
    @rm -rf $(OBJS) $(OUT) *.lib *.so

3.makefile符号以及变量

3.1 各类赋值操作

=   进行赋值 (变量的值是整个Makefile中最后的值)
    :=  直接赋值,赋予当前位置的值
    ?=  如果没有被赋值,则赋予等号后面的值
    +=  累加,标识将等号后面的值添加到前面的变量上

示例: x := foo y := $(x) bar x := later 结果: x=foo bar x=later

3.2 常见变量

makefile中常见的变量

$@  目标文件
    $^  所有依赖的文件
    $<  第一个依赖的文件
    $?  表示比目标还要新的依赖文件列表
    通过使用上述变量,简化makefile文件
    目标:依赖项
    main:main.o mytool1.o mytool2.o 
        gcc -o main main.o mytool1.o mytool2.o 
    优化成
        gcc -o $@ $^

3.3 makefile中函数

makefile中常见的函数,有字符处理函数,流程控制函数等。

1.findstring

$(findstring FIND,IN) 在字符串IN中,查找FIND字串

2.strip

$(strip ) 去掉空格函数--strip 去掉字符串中开头和结尾的空字符 返回被去掉空格的字符串值 示例:$(strip a b c ) 得到:a b c

3.subst

$(subst , , ) 字符串替换函数 把字串中的字符串替换成

4.patsubst

$(patsubst ,,) 模式字符串替换函数——patsubst。 查找中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔) 是否符合模式,如果匹配的话,则以替换。 这里,可以包括通配符%,表示任意长度的字串。 如果中也包含%,这个%将是中 的那个%所代表的字串。(可以用/来转义,以/%来表示真实含义的%字符)

5.filter

$(filter ,) 过滤出 text 中符合模式 pattern 的字符串,可以有多个 pattern ,返回值为过滤后的字符串。

4.使用示例

main.o:main.c defs.h
        CC -c main.c

    #compile share lib
    OBJS = dynamiclib_add.o 
    SRCS = dynamiclib_add.h 
    $(OBJS):$(SRCS)
        $(CC) $(CFLAGS) $(INCLUDE) -c $^
    all:$(OBJS)
        $(CC) -shared -fPIC -o$(TARGET)$(OBJS)