目标:依赖
.PHONY: clean
命令
注释: #;
若要输入#,则使用\#
命令要以Tab键开头;
#为注释符。
@echo表示禁止echo回显。
1) :=为立刻赋值,如B :=$(A)时,它只会到这句语句之前去找A的值,如A没有定义所以什么都没有输出。
2) =不是立刻赋值,而是从makefile文件最后往前找。
3) ?=含义为:如没定义,则赋值。如:TEMP ?= var 等价于
ifeq($(TEMP),undefined)
TEMP = var
endif
ifeq ()
....
else
ifeq ()
...
endif
endif
ctrl+v+TAB。
预定义宏,示例:
HW=1 ifdef HW contxt="hello" else contxt="local" endif all: echo $(contxt)
如上例,若HW为真,则输出为hello,若HW为假,则输出为local。
ifeq...else...endif
条件编译,示例:
ifeq($(gdb),y) echo "debug" else echo "release" endifmake时,可以加编译选项make gdb=y使编译出debug版本;也可以在makefile文件中定义变量来实现。
$(shell pwd)中shell的意义
makefile中,要调用shell脚本。需要特殊的语法。 比如要调用xxx命令。 相应的语法是 $(shell xxx) 你直接使用xxx,比如pwd命令。人家makefile哪知道是shell命令啊。它只会把pwd当成makefile变量或者规则。如:
p=$(shell pwd)
all:
echo $p
ar命令
在makefile中用ar 创建静态库.a,一般加参数rcs,即 ar rcs libxxx.a a.o b.o;
STRIP命令
当最终的可执行程序不需要包含调试信息时,可使用“strip”去掉可执行程序中的调试符号以减小最终的程序大小。
ifeq() else endif
条件判断 oo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
awk
echo $i | awk -F ':' '{print "#define " "SERVER_"$1" " "\""$2"\""}' >> $sfile; 按照分割符:进行操作,将分割符前后的内容显示;
1、wildcard : 扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符
SRC = $(wildcard *.c) $(wildcard inc/*.c)
自动化编译;
1) make -C dir :切换到指定目录再执行 make 过程,makefile 在这个指定目录里面;通常出现在makefile文件中;
2) 伪目标是一个标签不是文件,所以需要指定才可以执行,如make clean;一般用.PHONY指定(指定后伪目标就可以和真正的目标重名了);一般没有依赖,但是我们可以为伪目标指定依赖并将它放在第一个使其成为默认目标,如all;
3) STRIP的含义是当最终的可执行程序不需要包含调试信息时,可使用“strip”去掉可执行程序中的调试符号以减小最终的程序大小。
4) := 是立即变量赋值,在定义时值已经被确定;
= 是延时变量赋值,只有在这个变量被使用时才展开,$(VAR)就是一种被使用 4)
5)$@ 代表目标 上例为$(BUILT_IN_OBJ)
$^ 代表所有的依赖对象 上例第一个$^为$(OBJS),即 ifconfig.o tftp_util.oping.o,上例第二个$^为$(SRCS),即$(OBJS:.o=.c) (Makefile解释后为: ifconfig.ctftp_util.c ping.c)
$< 代表第一个依赖对象 前面例子修改如下:
$(BUILT_IN_OBJ) : $(OBJS)
Makefile文件
自动化编译;
1) make -C dir :切换到指定目录再执行 make 过程,makefile 在这个指定目录里面;通常出现在makefile文件中;
2) 伪目标是一个标签不是文件,所以需要指定才可以执行,如make clean;一般用.PHONY指定(指定后伪目标就可以和真正的目标重名了);一般没有依赖,但是我们可以为伪目标指定依赖并将它放在第一个使其成为默认目标,如all;
3) STRIP的含义是当最终的可执行程序不需要包含调试信息时,可使用“strip”去掉可执行程序中的调试符号以减小最终的程序大小。
4) := 是立即变量赋值,在定义时值已经被确定;
= 是延时变量赋值,只有在这个变量被使用时才展开,$(VAR)就是一种被使用 4)
5)$@ 代表目标 上例为$(BUILT_IN_OBJ)
$^ 代表所有的依赖对象 上例第一个$^为$(OBJS),即 ifconfig.o tftp_util.oping.o,上例第二个$^为$(SRCS),即$(OBJS:.o=.c) (Makefile解释后为: ifconfig.ctftp_util.c ping.c)
$< 代表第一个依赖对象 前面例子修改如下:
$(BUILT_IN_OBJ) : $(OBJS)