zoukankan      html  css  js  c++  java
  • Makefile变量

    自定义变量

    = 是最基本的赋值,会把整个makefile展开之后再决定是多少

    x=foo
    y=$(x)bar	#y是asdbar,不是foobar
    x=asd		
    

    := 是覆盖之前的值,和=不同,和赋值的位置有关

    x=foo
    y:=$(x)bar	#y是foobar
    x=asd
    

    ?= 是如果没有被赋值过就赋予等号后面的值,赋过了就不管了
    += 是添加等号后面的值

    变量的使用

    和shell一样,makefile通过$(FLAGS)来读取变量FLAGS的值,对于$本身,使用$$读取

    变量替换

    注意这两种替换的方式都得使用变量名,不能使用变量的内容,即不能写成诸如$($(VAR):o=a)的形式,其他返回内容的函数也不行,均会导致替换的失败
    makefile中有两种变量替换,

    1. 形如$(var:a=b)或者${var:a=b},是把var中以a结尾的变量替换为b
    OBJ=./obj/test.o
    OBJ2=$(OBJ:o=a)
    all:
    	@echo "OBJ:$(OBJ)"
    	@echo "OBJ2:$(OBJ2)"
    #############################
    $make all
    OBJ:./obj/test.o
    OBJ2:./obj/test.a
    
    1. 使用模式匹配的方式表示替换内容
    OBJ=./obj/test.o
    OBJ2=$(OBJ:%.o=%.a)
    all:
    	@echo "OBJ:$(OBJ)"
    	@echo "OBJ2:$(OBJ2)"
    ############################
    $make all
    OBJ:./obj/test.o
    OBJ2:./obj/test.a
    

    自动化变量

    ? 所有比目标新的依赖的集合,以空格分隔,通常用他们的值,即$?
    @ 规则中的目标文件集,如果有多个目标,那么就是匹配于目标中模式定义的集合,通常用他们的值,即$@
    % 仅当目标是函数库文件中,表示规则中的目标成员名,如果不是,为空,通常用他们的值,即$%
    < 依赖目标中的第一个目标的名字,通常用他们的值,即$<
    ^ 所有依赖目标的集合,以空格分隔,去除重复的依赖目标,通常用他们的值,即$^
    + 所有依赖目标的集合,不去除重复的依赖目标,通常用他们的值,即$+
    * 表示目标模式中 %之前的部分,通常用他们的值,即$*
    @D 表示@的目录部分(不以/结尾),通常用他们的值,即$(@D)
    @F 表示@的文件部分,通常用他们的值,即$(@F)
    。。。另外6个同理

    环境变量

    makefile会自动读取系统中的环境变量,并复制一份一模一样的,如果用户在makefile中定义的同名的变量,那么原来的环境变量就会被覆盖

    VPATH

    虚路径,如果没有指明VPATH变量,make只会在当前目录中去寻找依赖文件和目标文件,如果定义了VPATH,则make会在当前目录找不到的情况下,到所制定的目录中去找文件,这个变

    VPATH=src:../headers
    

    vpath

    vpath是一个指令,可以用来搜索文件,通常有三种用法:

    1. VPATH <pattern> <directories>为符合模式<pattern>的文件指定搜索目录
    2. VPATH <pattern> 清除符合模式<pattern>的文件的搜索目录
    3. VPATH 清除所有已被设置好了的文件搜索目录
      这里,<pattern>需要包含 %字符,eg: vpath %.h ../headers
      如果多条vpath语句中出现了重复的<pattern>,则会按照先后顺序搜索
      print: *.c #依赖关系的通配符会被自动展开,表示print目标依赖于所有的.c 文件
      object=*.c #变量中的通配符不会被展开object就是 “
      .c”需要使用wildcard来展开

    例子

    #Makefile文件
    CC:=gcc
    CFLAGS:= -O2 -I ./include
    TARGET:=linkstack
    OBJS:=linkstack.o linkstack_main.o
    HDRS:=linkstack.h
    SRC:=$(OBJS:%.o=%.c)                #注意,这里不能用$(OBJS)
    VPATH=./src:./include/
    #vpath %.h ./include/
    $(TARGET):$(OBJS)
    	$(CC) $(CFLAGS) $^ -o $@
    $(OBJS):$(SRC) $(HDRS)
    	$(CC) -c $^ $(CFLAGS)
    .PHONY:clean
    clean:
    	$(RM) $(OBJS) $(TARGET) 
    

    make执行前后的变化

    $tree
    .
    ├── include
    │   └── linkstack.h
    ├── Makefile
    └── src
        ├── linkstack.c
        └── linkstack_main.c
    
    2 directories, 4 files
    $make
    gcc -c ./src/linkstack.c ./src/linkstack_main.c -O2 -I ./include
    gcc -O2 -I ./include linkstack.o linkstack_main.o -o linkstack
    $tree
    .
    ├── include
    │   └── linkstack.h
    ├── linkstack
    ├── linkstack_main.o
    ├── linkstack.o
    ├── Makefile
    └── src
        ├── linkstack.c
        └── linkstack_main.c
    
    2 directories, 7 files
    $make clean
    $tree
    .
    ├── include
    │   └── linkstack.h
    ├── Makefile
    └── src
        ├── linkstack.c
        └── linkstack_main.c
    
    2 directories, 4 files
    
  • 相关阅读:
    线程的基础知识
    并行编程与PLINQ
    swing组件中数据更新与UI更新的关系
    关于EDT和SwingUtilities的invokeLater和invokeAndWait
    内容页访问母版页页控件的方法
    asp.net 中一般应用处理程序使用session
    正则表达式学习日记
    C#中马赛克算法
    初学C与C在TC2.0上运行的注意事项
    delphi7中两个BT的Bug
  • 原文地址:https://www.cnblogs.com/xiaojiang1025/p/5955083.html
Copyright © 2011-2022 走看看