关于程序员:陆变量的高级主题上

52次阅读

共计 3869 个字符,预计需要花费 10 分钟才能阅读完成。

陆 – 变量的高级主题(上)

变量值的替换

  • 应用指定字符 (串) 替换变量值中的后缀字符(串)
  • 语法格局:$(var:a=b) 或者 $(var:a=b)

    • 替换表达式中不能有任何的空格
    • make 中反对应用 ${} 对变量进行取值
src := a.cc b.cc c.cc
obj := $(src:cc=o)    //  变量值的替换 a.o b.o c.o

test : 
    @echo "obj => $(obj)"

变量的模式替换

  • 应用 % 保留变量值中的指定字符串,替换其余字符
  • 语法格局:$(var:a%b=x%y)或 %{var:a%b=x%y}

    • 替换表达式中不能有任何的空格
    • make 中反对应用 ${} 对变量进行取值
src := a1b.c a2b.c a3b.c
obj := $(src:a%b.c==x%y)   // a1b.c ==>> x1y
test:
    @echo "obj => $(obj)"  
    
 .PHONY : test1 test2

src1 := a.cc b.cc c.cc
obj1 := $(src1:cc=o)

test1 :
    @echo "obj1 => $(obj1)"
    
    
src2 := a11b.c a22b.c a33b.c  
obj2 := $(src2:a%b.c=x%y)

test2 :
    @echo "obj2 => $(obj2)"
obj1 => a.o b.o c.o
obj2 => x11y x22y x33y

规定中的模式替换

targets : target-pattern : prereq-pattern   
    command1   
    command2
    ......

意义:
通过 target-pattern 从 targets 中匹配指标,在通过 prereq-pattern 从子目标生成依赖,进而形成残缺的规定

规定中的模式替换示例

% 认为是通配符  

OBJ := func.o main.o
$(OBJS) : %.o : %.c  // func.o : %.c  ==>> func.o : func.c
    gcc -o $@ -c $^
// 等效   
func.o : func.c
    gcc -o $@ -c $^  

main.o : main.c
    gcc -o $@ -c $^

编程试验:模式规定匹配的利用

// 源文件  
CC := g++
TARGET := hello-world.out

$(TARGET) : func.o main.o
    $(CC) -o $@ $^

func.o : func.c
    $(CC) -o $@ -c $^

main.o : main.c
    $(CC) -o $@ -c $^

.PHONY : rebuild clean all

rebuild : clean all


all : $(TARGET)

clean :
    $(RM) *.o $(TARGET)  
    

进行模式匹配批改

CC := g++
TARGET := hello-world.out
OBJS := func.o main.o const.o

$(TARGET) : $(OBJS)
    $(CC) -o $@ $^


$(OBJS) : %.o : %.c
    $(CC) -o $@ -c $^

.PHONY : rebuild clean all

rebuild : clean all


all : $(TARGET)

clean :
    $(RM) *.o $(TARGET)

这里的益处就是只须要在 OBJS 增加新减少的 文件就间接能编译了

变量值的嵌套援用

  • 一个变量名之中能够蕴含对其余变量的援用
  • 嵌套援用的实质是应用一个变量示意另外 一个变量
x := y
y := z
a := $($(x))   

// 等效  
a := $(y)  

// 等效    
a :=z

$() 是取变量的值!!

命令行变量

  • 运行 make 时,在命令行定义变量
  • 命令行变量默认笼罩 makefile 中定义的变量
hm := hello makefile  

test :
    @echo "hm => $(hm)"  

 // make   
 make hm=cmd   
 
 // 等效 
 hm =>cmd

以命令行变量为准,理论开发中的用处长期编译,扭转编译形式

override 关键字

  • 用于批示 makefile 重够定义的变量不能被笼罩
  • 变量的定义和赋值都须要应用 override 关键字
  • 避免命令行笼罩
override var := test  
test :
    @echo "var => $(var)"   
    
// meke  
make var=cmd   

// 后果   
hm =>test   

编程试验

hm := hello makefile
override var := override-test  

test :
    @echo "hm => $(hm)"
    @echo "var => $(var)"
    @echo "foo => $(foo)"
// 命令行定义变量笼罩原来的变量,笼罩胜利
// 命令行定义变量笼罩原来的变量,笼罩失败,因为 override 
// 命令行能够长期赋值比方 foo
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make hm=test var=hello foo=foo
hm => test
var => override-test  
foo => foo

define 关键字

  • 用于在 makefile 中定义多行变量
  • 多行变量的定义从变量名开始到 endef 完结
  • 可应用 overrride 关键字避免变量被笼罩
  • define 定义的变量 等价于应用 = 定义的变量
define foo
I'm fool!
endef   

override define cmd
    @echo "run cmd ls ..."  
    @ls
endef

编程试验 3.1

hm := hello makefile

override var := override-test

test : 
    @echo "hm => $(hm)"
    @echo "var => $(var)"
    @echo "foo =>$(foo)"

输入试验 1

zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make
hm => hello makefile
var => override-test
foo =>

输入试验 2

zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make hm:=hm-cmd var:=var-test
hm => hm-cmd
var => override-test
foo =>

命令行能够笼罩值,除了 override 润饰的变量

输入试验 3

zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make foo:=foo
hm => hello makefile
var => override-test
foo =>foo

命令行定义没有定义的变量,切命令行也反对不同的赋值形式

编程试验 3.2

define cmd
    @echo "run cmd ls  ......."
    @ls
endef

test : 
    $(cmd)
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make
run cmd ls  .......
~    51-1.c     config   DT_timer.c  fun.c   hello-world.out  makefile            nginx5_3_1_server.c  program.c
50-2.c    51-1.h     const.c  DT_timer.h  func.c  main.c           nginx            nginx5_3_2_server.c  test.c
50-2.h    chap-23  const.o  dup.c       func.o  main.o           nginx-1.14.2.tar.gz  nginx.c         test.cpp

cmd 这个变量是多行变量,所以须要 define

编程试验 3.3

hm := hello makefile
override var := override-test  

define foo
i'm foo
endef  

# cmd 这个变量是多行变量,所以须要 define
override define cmd             
    @echo "run cmd ls ......"
    @ls
endef

test :
    @echo "hm => $(hm)"
    @echo "var => $(var)"
    @echo "foo => $(foo)"
    $(cmd)
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make
hm => hello makefile
var => override-test  
foo => i'm foo
run cmd ls ......
~    51-1.c     config   DT_timer.c  fun.c   hello-world.out  makefile            nginx5_3_1_server.c  program.c
50-2.c    51-1.h     const.c  DT_timer.h  func.c  main.c           nginx            nginx5_3_2_server.c  test.c
50-2.h    chap-23  const.o  dup.c       func.o  main.o           nginx-1.14.2.tar.gz  nginx.c         test.cpp
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make foo=cmd-foo
hm => hello makefile
var => override-test  
foo => cmd-foo
run cmd ls ......
~    51-1.c     config   DT_timer.c  fun.c   hello-world.out  makefile            nginx5_3_1_server.c  program.c
50-2.c    51-1.h     const.c  DT_timer.h  func.c  main.c           nginx            nginx5_3_2_server.c  test.c
50-2.h    chap-23  const.o  dup.c       func.o  main.o           nginx-1.14.2.tar.gz  nginx.c         test.cpp

这里 foo 的值和下面不一样的起因是 foo 的在命令行递归赋值了

小结

  • 变量值的替换:$(var:a=b) 或者 ${var:a=b}
  • 变量的模式替换 : $(var:a%b=x%y) 或者 ${var:a%b=x%y}
  • makefile 反对将模式替换能够间接用于规定中

正文完
 0