学习Makefile第三课------书写命令
2014-09-02 20:14
351 查看
make会一按顺序一条一条的执行命令,每条命令的开头必须以[Tab]键开头,除非,命令是紧跟在依赖
规则后面的分号后的。
(一).显示命令
①@echo 正在编译XX模块。。。。 执行make时,显示 “正在编译XX模块。。。。”
② echo 正在编译XX模块。。。。 执行make时,显示“echo 正在编译XX模块。。。。” ③ 在make执
行时,带入make参数 “-n”或者“--just-print”,只显示命令,不会执行命令,利于调式
④ make参数“-s”或者“--slient”则是全面禁止命令的显示
(二).命令的执行
如果希望第二条命令在第一条命令的基础上执行,写在同一行,例1打印当前目录的路径,例2打印hchen
的路径
例1:exec:
cd /home/hchen
pwd
例2:exec:
cd /home/hchen ;pwd
(三)命令出错
1.忽略命令出错,继续执行,在make命令行前加一个减号“-”
clean:
-rm -f*.o
2.给make加上“-i”或者“--ignore-errors”参数
3.make的参数“-k”或者“--keep-going”
(四)嵌套执行make
例如,我们有一个子目录叫subdir,这个目录下有个Makefile文件,来指明了这个目录下文
件的编译规则。那么我们总控的Makefile可以这样书写:
subsystem:
cd subdir && $(MAKE)
其等价于:
subsystem:
$(MAKE) -C subdir
定义$(MAKE)宏变量的意思是,也许我们的make需要一些参数,所以定义成一个变量比较
利于维护。这两个例子的意思都是先进入“subdir”目录,然后执行make命令。
如果你要传递变量到下级Makefile中,那么你可以使用这样的声明:export <variable ...>
如果你不想让某些变量传递到下级Makefile中,那么你可以这样声明:unexport <variable ...>
如:
示例一:
export variable = value
其等价于:
variable = value
export variable
其等价于:
export variable := value
其等价于:
variable := value
export variable
示例二:
export variable += value
其等价于:
variable += value
export variable
如果你要传递所有的变量,那么,只要一个export 就行了。后面什么也不用跟,表示传递
所有的变量。
make命令中的有几个参数并不往下传递:“-C”,“-f”,“-h”“-o”“-W”
“-w”或是“--print-directory”会在make的过程中输出一些信息,让你看到目前的工作目录。比如,如果我们的下级make目录是“/home/hchen/gnu/make”,如果我们使用“make -w”来执行,那么当进入该目录时,我们
会看到:
make: Entering directory `/home/hchen/gnu/make'.
而在完成下层make后离开目录时,我们会看到:
make: Leaving directory `/home/hchen/gnu/make'
当你使用“-C”参数来指定make下层Makefile时,“-w”会被自动打开的。如果参数中有
“-s”(“--slient”)或是“--no-print-directory”,那么,“-w”总是失效的。
(五)定义命令包
如果Makefile中出现一些相同命令序列,那么我们可以为这些相同的命令序列定义一个变量。定义这种命令序列的语法以“define”开始,以“endef”结束,如:
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
这里,“run-yacc”是这个命令包的名字,其不要和Makefile中的变量重名。在“define”和“endef”中的两行就是命令序列。这个命令包中的第一个命令是运行Yacc程序,因为Yacc程序总是生成“y.tab.c”的文件,所以第二行的命令就是把这个文件改改名字。还是把这个命令包放到一个示例中来看看吧。
foo.c : foo.y
$(run-yacc)
我们可以看见,要使用这个命令包,我们就好像使用变量一样。在这个命令包的使用中,命令包“run-yacc”中的“$^”就是“foo.y”,“$@”就是“foo.c”(有关这种以“$”开头的特殊变量,我们会在后面介绍),make在执行命令包时,命令包中的每个命令会被依次独立执行。
define run-yacc
yacc ¥(firstword foo.y) ------ 运行yacc
mv y.tab.c foo.c -------改名
来自《跟我一起写Makefile》
规则后面的分号后的。
(一).显示命令
①@echo 正在编译XX模块。。。。 执行make时,显示 “正在编译XX模块。。。。”
② echo 正在编译XX模块。。。。 执行make时,显示“echo 正在编译XX模块。。。。” ③ 在make执
行时,带入make参数 “-n”或者“--just-print”,只显示命令,不会执行命令,利于调式
④ make参数“-s”或者“--slient”则是全面禁止命令的显示
(二).命令的执行
如果希望第二条命令在第一条命令的基础上执行,写在同一行,例1打印当前目录的路径,例2打印hchen
的路径
例1:exec:
cd /home/hchen
pwd
例2:exec:
cd /home/hchen ;pwd
(三)命令出错
1.忽略命令出错,继续执行,在make命令行前加一个减号“-”
clean:
-rm -f*.o
2.给make加上“-i”或者“--ignore-errors”参数
3.make的参数“-k”或者“--keep-going”
(四)嵌套执行make
例如,我们有一个子目录叫subdir,这个目录下有个Makefile文件,来指明了这个目录下文
件的编译规则。那么我们总控的Makefile可以这样书写:
subsystem:
cd subdir && $(MAKE)
其等价于:
subsystem:
$(MAKE) -C subdir
定义$(MAKE)宏变量的意思是,也许我们的make需要一些参数,所以定义成一个变量比较
利于维护。这两个例子的意思都是先进入“subdir”目录,然后执行make命令。
如果你要传递变量到下级Makefile中,那么你可以使用这样的声明:export <variable ...>
如果你不想让某些变量传递到下级Makefile中,那么你可以这样声明:unexport <variable ...>
如:
示例一:
export variable = value
其等价于:
variable = value
export variable
其等价于:
export variable := value
其等价于:
variable := value
export variable
示例二:
export variable += value
其等价于:
variable += value
export variable
如果你要传递所有的变量,那么,只要一个export 就行了。后面什么也不用跟,表示传递
所有的变量。
make命令中的有几个参数并不往下传递:“-C”,“-f”,“-h”“-o”“-W”
“-w”或是“--print-directory”会在make的过程中输出一些信息,让你看到目前的工作目录。比如,如果我们的下级make目录是“/home/hchen/gnu/make”,如果我们使用“make -w”来执行,那么当进入该目录时,我们
会看到:
make: Entering directory `/home/hchen/gnu/make'.
而在完成下层make后离开目录时,我们会看到:
make: Leaving directory `/home/hchen/gnu/make'
当你使用“-C”参数来指定make下层Makefile时,“-w”会被自动打开的。如果参数中有
“-s”(“--slient”)或是“--no-print-directory”,那么,“-w”总是失效的。
(五)定义命令包
如果Makefile中出现一些相同命令序列,那么我们可以为这些相同的命令序列定义一个变量。定义这种命令序列的语法以“define”开始,以“endef”结束,如:
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
这里,“run-yacc”是这个命令包的名字,其不要和Makefile中的变量重名。在“define”和“endef”中的两行就是命令序列。这个命令包中的第一个命令是运行Yacc程序,因为Yacc程序总是生成“y.tab.c”的文件,所以第二行的命令就是把这个文件改改名字。还是把这个命令包放到一个示例中来看看吧。
foo.c : foo.y
$(run-yacc)
我们可以看见,要使用这个命令包,我们就好像使用变量一样。在这个命令包的使用中,命令包“run-yacc”中的“$^”就是“foo.y”,“$@”就是“foo.c”(有关这种以“$”开头的特殊变量,我们会在后面介绍),make在执行命令包时,命令包中的每个命令会被依次独立执行。
define run-yacc
yacc ¥(firstword foo.y) ------ 运行yacc
mv y.tab.c foo.c -------改名
来自《跟我一起写Makefile》
相关文章推荐
- Makefile学习之书写命令
- linux下Makefile学习之三(书写命令)
- Makefile 书写命令
- 深入学习Make命令和Makefile(上)
- 跟我一起写Makefile:书写命令
- 深入学习Make命令和Makefile(下)
- Makefile书写规则与书写命令
- U-boot 编译学习---make TQ2440_config命令执行过程---在 Makefile 中
- makefile详解 书写命令 十五
- 深入学习Make命令和Makefile(下)
- makefile详解 (五) 书写命令
- 深入学习Make命令和Makefile(下)
- Makefile详解 书写命令
- makefile 详解2 --书写命令
- Makefile学习之书写规则
- 跟我一起写makefile-4(书写命令)
- makefile 详解2 --书写命令
- [转] Gnu makefile 详细教程 - 4 : Makefile 书写命令
- 深入学习Make命令和Makefile
- 跟我一起写 Makefile——1.6 书写命令