[关闭]
@cyysu 2017-10-17T06:41:06.000000Z 字数 2109 阅读 851

Makefile-基础篇(五)

  • 时间:2017年10月16日
  • 作者:Kali
  • 邮箱:cyysu.github.io@gmail.com
  • 版本:3.0
  • 描述:Makefile-基础五,为Linux 4.4 Makefile中所遇到的知识点汇总

Makefile系列教程


前期准备

  1. # Makefile call函数例子
  2. # call 函数是唯一一个可以用来创建新的参数化的函数。你可以写一个非常复杂的表达式, 这个表达式中,你可以定义许多参数,然后你可以用call函数来向这个表达式传递参数。其语法是:
  3. $(call <expression>,<parm1>,<parm2>,<parm3>...)
  4. # 当make执行这个函数时,<expression>参数中的变量,如$(1),$(2),$(3)等,会被参 数<parm1>,<parm2>,<parm3>依次取代。而<expression>的返回值就是call函数的返回值。
  5. 下面举个例子来说明
  6. mj@DZ:~/桌面$ cat Makefile
  7. SIGNAL = $(shell printf "\033[34;1m★\033[0m")
  8. reverse = $2 $1
  9. foo = $(call reverse, jhello,dawdad)
  10. _all:
  11. @echo $(foo)
  12. mj@DZ:~/桌面$ make
  13. dawdad jhello
  14. # makefile patsubst函数
  15. patsubstpatten substitude的缩写,匹配替代的意思。下面看一个例子
  16. mj@DZ:~/桌面$ cat Makefile
  17. SIGNAL = $(shell printf "\033[34;1m★\033[0m")
  18. reverse = $2 $1
  19. SRC = a.c b.c m.c.c
  20. all:
  21. @echo $(patsubst %.c,%.s,${SRC})
  22. @echo $(patsubst %.c,%,${SRC})
  23. @echo $(subst .c,.s, ${SRC})
  24. # 执行结果
  25. mj@DZ:~/桌面$ make
  26. a.s b.s m.c.s
  27. a b m.c
  28. a.s b.s m.s.s
  29. # 如果我们没有匹配上,那么会输出原字符串
  30. mj@DZ:~/桌面$ cat Makefile
  31. SIGNAL = $(shell printf "\033[34;1m★\033[0m")
  32. reverse = $2 $1
  33. SRC = a.c b.c m.c.c
  34. all:
  35. @echo $(patsubst "%.c","%.s",${SRC})
  36. @echo $(patsubst %.c,%.s,${SRC})
  37. @echo $(patsubst %.c,%,${SRC})
  38. @echo $(subst .c,.s, ${SRC})
  39. # 执行结果
  40. mj@DZ:~/桌面$ make
  41. a.c b.c m.c.c
  42. a.s b.s m.c.s
  43. a b m.c
  44. a.s b.s m.s.s
  45. # makefile notdir函数
  46. 功能: 从文件名序列 <names> 中取出非目录部分
  47. # 下面来看一个例子
  48. mj@DZ:~/桌面$ cat Makefile
  49. SIGNAL = $(shell printf "\033[34;1m★\033[0m")
  50. reverse = $2 $1
  51. SRC = a.c b.c m.c.c
  52. DD=$(notdir /home/a.c ./bb.c ../c.c d.c)
  53. all1:
  54. @echo $(DD)
  55. mj@DZ:~/桌面$ make
  56. a.c bb.c c.c d.c
  57. ########下面还有几个函数,大家可以自己去练习
  58. 取目录函数: $(dir <names...>)
  59. 功能: 从文件名序列 <names> 中取出目录部分
  60. 返回: 文件名序列 <names> 中的目录部分
  61. # Makefile 内容
  62. all:
  63. @echo $(dir /home/a.c ./bb.c ../c.c d.c)
  64. $ make
  65. /home/ ./ ../ ./
  66. 取后缀函数: $(suffix <names...>)
  67. 功能: 从文件名序列 <names> 中取出各个文件名的后缀
  68. 返回: 文件名序列 <names> 中各个文件名的后缀, 没有后缀则返回空字符串
  69. # Makefile 内容
  70. all:
  71. @echo $(suffix /home/a.c ./b.o ../c.a d)
  72. $ make
  73. .c .o .a
  74. 取前缀函数: $(basename <names...>)
  75. 功能: 从文件名序列 <names> 中取出各个文件名的前缀
  76. 返回: 文件名序列 <names> 中各个文件名的前缀, 没有前缀则返回空字符串
  77. # Makefile 内容
  78. all:
  79. @echo $(basename /home/a.c ./b.o ../c.a /home/.d .e)
  80. $ make
  81. /home/a ./b ../c /home/
  82. # foreach函数,直接用例子来说
  83. mj@DZ:~/桌面$ cat Makefile
  84. # Makefile 内容
  85. targets := a b c d
  86. objects := $(foreach i,$(targets),$(i).o)
  87. all:
  88. @echo $(targets)
  89. @echo $(objects)
  90. # 运行结果
  91. mj@DZ:~/桌面$ make
  92. a b c d
  93. a.o b.o c.o d.o

上面的例子我是摘自下面这篇文章,书写格式也很悦目,大家可以查看一下
http://www.cnblogs.com/wang_yb/p/3990952.html

打赏

                    支付宝                                                         微信

微信与支付宝支付

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注