自定义变量

= 是最基本的赋值,会把整个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
  2. 使用模式匹配的方式表示替换内容

    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

Makefile变量的更多相关文章

  1. makefile变量赋值

    在定义变量的值时,我们可以使用其它变量来构造变量的值,在Makefile中有两种方式来在用变量定义变量的值. 先看第一种方式,也就是简单的使用“=”号,在“=”左侧是变量,右侧是变量的值,右侧变量的值 ...

  2. Makefile学习(一)变量

    鉴于之前有一些了解,还有自己的学习习惯,我一上来就看Makefile的变量这一章.主要脉络是根据GNU make中文手册. 第六章:Makefile中的变量 6使用变量 定义:变量是一个名字,代表一个 ...

  3. Makefile中的变量和shell变量

    我们在写makefile时 多多少少会用到shell脚本, 对于变量的在shell中的使用有一些要注意的细节.让我们从一个简单的makefile来看看. 注意makefile中一定要有一个目标,且一定 ...

  4. Makefile

    原文链接:http://www.orlion.ga/816/ 一.基本规则 对于一个拥有多个文件的c项目,编译时可能是这样的指令: gcc main.c stack.c -o main 如果编译之后又 ...

  5. Makefile 规则的使用

    1.Makefile格式 //最终目标 all: led.o //依赖 arm-linux-ld -Tled.lds -o led.elf led.o //命令 arm-linux-objcopy - ...

  6. Makefile编译选项CC与CXX/CPPFLAGS、CFLAGS与CXXFLAGS/LDFLAGS

    转自:http://www.firekyrin.com/archives/597.html 编译选项 让我们先看看 Makefile 规则中的编译命令通常是怎么写的. 大多数软件包遵守如下约定俗成的规 ...

  7. Makefile基础

    1.规则 规则定义格式如下 目标 : 条件1 条件2 ... 命令1 命令2 ... 隐含规则和模式规则(略) 2.变量 Makefile变量像C的宏定义一样,代表一串字符,在取值的地方展开. 1)两 ...

  8. Makefile笔记

    一个简单的Makefile描述规则组成: TARGET...:PREREQUISITES... COMMANDS... ... target:规则的目标.通常是程序中间或者最后要生成的文件名,也可以是 ...

  9. makefile使用

    linux make手册:http://www.gnu.org/software/make/manual/make.html 一篇文章: 假设我们有一个程序由5个文件组成,源代码如下:/*main.c ...

随机推荐

  1. 未能解析此远程名称: &#39;api.ucpaas.com&#39;

     未能解析此远程名称: 'api.ucpaas.com'  这个问题的原因不是云之讯,而是(我用的是阿里云)云服务器的DNS解析的问题 或者是云服务器后台的安全组规则的问题, 应该把内网入方向和内网出 ...

  2. Rotate Image

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  3. Spring Bean配置

    Spring 是什么 •Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. •Spring 是一个 IOC(DI) 和 ...

  4. 【转】JVM内存模型

    http://longdick.iteye.com/blog/473866 图解JVM内存模型 博客分类: JVM JVM活动SUN  /** *  转载请注明作者longdick    http:/ ...

  5. 动态插入、添加删除表格行的JS代码

    <html> <head> <title>Table对象的方法</title> <script language="JavaScript ...

  6. squid 延伸

    #openssl req -new -x509 -days 365 -nodes -out stunnel.pem -keyout stunnel.pem # openssl gendh 512> ...

  7. git使用(一)

    github因为众所周知的一些问题,不方便选为远程仓库,在此,我们选用oschina的远程仓库,首先去http://git.oschina.net/申请一个账号. 第一步,安装git(下载电脑系统对应 ...

  8. define预处理以及宏定义

    define的定义方式 无参一般形式:#define 标认符 字符串                     比如:#define COUTD "%d\n" 带参一般形式:#def ...

  9. 最长不下降子序列//序列dp

    最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 最长不下降 ...

  10. javascript DOM 节点 第18节

    <html> <head> <title>DOM对象</title> </head><body><div >DOM对 ...