这里的usage,targets,savetarget,savedefines都是伪目标。
和all不同,这些伪目标不会被执行,除非显式指定这些目标。
这里有两个目标savetarget,savedefines前边我们提过。
通过命令 make TARGET=esb savetarget可以保存默认的TARGET到Makefile.target中。
通过命令 make TARGET=esb DEFINES=MYTRACE,MYVALUE=4711 savedefines 可以保存默认的DEFINES到Makefile.$(TARGET).DEFINES中。
先准备一些预备知识,GNU的make工作的执行步骤:
1、读入所有的Makefile
2、读入被include的其他Makefile
3、初始化文件中的变量
4、推导隐晦规则,并分析所有规则
5、为所有目标文件创建依赖关系链
6、根据依赖关系,决定哪些目标要重新生成
7、执行生成命令
执行make TARGET=esb savetarget命令时:
1、先读入所有Makefile(包括include的Makefile),初始化所有变量(TARGET=esb)
2、推导规则,创建依赖关系,这里是伪目标,故只执行savetarget后边的命令
savetarget:
-@rm -f Makefile.target
@echo "saving Makefile.target"
@echo >Makefile.target "TARGET = $(TARGET)"
含义:
第一句命令:强行删除文件Makefile.target,出错时继续执行后续命令(-符号的作用)
注:@符号的作用,是指这个命令不被显示出来
第二句命令:显示 "saving Makefile.target"提示信息
第三句命令:将 "TARGET = $(TARGET)" 重定向到文件Makefile.target,即保存默认的TARGET到文件Makefile.target文件中
可以看到TARGET = esb 被保存到文件Makefile.target中。
这里有个错误提示,make:msp430-gcc:Command not found
提示信息发生在读取完../../cpu/msp430/Makefile.msp430这个文件之后。esb平台是用msp430CPU的,故会导入Makefile.msp430。
这里是我的系统环境里边没有msp430-gcc引起的,但是为什么make TARGET=esb savetarget这个命令会使msp430-gcc执行,要具体看Makefile.msp430,不理。
执行make savetarget命令时:
因为没有显式定义TARGET变量,而且make的执行顺序是先初始化文件中变量,再根据依赖关系生成目标。
故TARGET会先被初始化为native(第一部分中的2),再保存到Makefile.target文件中
执行make TARGET=esb DEFINES=MYTRACE,MYVALUE=4711 savedefines命令时
1、先读入所有Makefile(包括include的Makefile),初始化所有变量(TARGET=esb,DEFINES=MYTRACE,MYVALUE=4711)
2、推导规则,创建依赖关系,这里是伪目标,故只执行savedefines后边的命令
savedefines:
-@rm -f Makefile.$(TARGET).defines
@echo "saving Makefile.$(TARGET).defines"
@echo >Makefile.$(TARGET).defines "DEFINES = $(DEFINES)"
第一句命令:强行删除文件Makefile.($TARGET).defines,出错时继续执行后续命令(-符号的作用)
注:@符号的作用,是指这个命令不被显示出来
第二句命令:显示 "saving Makefile.($TARGET).defines"提示信息
第三句命令:将 "DEFINES = $(DEFINES)" 重定向到文件Makefile.($TARGET).defines,即保存默认的DEFINES到文件Makefile.($TARGET).defines文件中
可以看到DEFINES = MYTRACE,MYVALUE=4711被保存到Makefile.esb.defines文件中。
注:变量是先被初始化的,然后再根据依赖关系去生成目标。
执行make usage命令时:
usage:
@echo "make MAKETARGETS... [TARGET=(TARGET)] [savetarget] [targets]"
usage是伪目标,只执行usage后边的命令。
输出 make MAKETARGETS... [TARGET=(TARGET)] [savetarget] [targets] 提示信息
告诉我们怎么用。
执行make targets命令时:
targets:
@ls -1 $(CONTIKI)/platform $(TARGETDIRS) | grep -v CVS
targets是伪目标,只执行标号targets后边的命令。
这里的命令分为两条:
ls -1 $(CONTIKI)/platform $(TARGETDIRS)
grep -v CVS
其中ls的-1参数是list one file per line,$CONTIKI/platform目录为默认的平台目录。
TARGETDIRS变量此处为空,我们也可以定义这个变量,保存我们自定义的平台目录。
| 是管道,连接上个指令的标准输出,做为下个指令的标准输入。
grep -v CVS(select non-matching lines) 选择没有CVS的行(lines)。
不知道CVS是什么,先不理。
最终输出默认平台目录$(CONTIKI)/platform和自定义平台目录$(TARGETDIRS)中,没有包含CVS的所有文件名。
因为自定义平台目录$(TARGETDIRS)为空,所以只输出了默认平台目录$(CONTIKI)/platform下所有不包含CVS的文件名(list one file per line),看上边三个图。
原文:http://www.cnblogs.com/songdechiu/p/6011792.html