zoukankan      html  css  js  c++  java
  • Makefile-2

    一、命令行参数

    -n/--just-print/--dry-run/--recon  只显示命令,但不会执行命令,用于调试 makefile。

    -s/--slient/--quiet  禁止命令的显示

    -e/--environment-overrides  系统环境变量将覆盖 makefile 中定义的变量

    -f/--file  指定 makefile 文件

    -t/--touch  只更新目标文件的时间而不编译。

    -B/--always-make  重编译所有目标

    -C/-directory=<dir>  指定读取 makefile 的目录

    --debug=[=<options>]  输出 make 调试信息,如果没有参数则为最简单的调试信息。可以为:

    a  all      所有的调试信息,最高

    b  basic    基本调试信息,最低

    v  verbose  包括哪个 makefile 被解析,不需要被重编译的依赖文件(或是依赖目标)等

    i  implicit  输出所有的隐含规则

    j  jobs  输出执行规则中命令的详细信息,如命令的PID,返回码等。

    m  makefile  输出 make 读取 makefile ,更新 makefile ,执行 makefile 的信息

    -d  相当于 --debug=a

    -i/--ignore-errors  忽略所有错误

    -I/--include-dir=<dir>  指定 makefile 的搜索路径

    -j/--jobs[=<jobsnum>]  并行执行

    -k/--keep-going  出错也不停止运行

    -S/--no-keep-going  取消 -k 的作用

    -o/--old-file=<file>/--assume-old=<file>  不重新生成指定的<file>

    -p/--print-data-base  输出 makefile 中的所有数据,包括所有的规则和变量。如果只想输出信息而不想执行,可以使用 make -qp,想要查看执行 makefile 前的预设变量和规则,使用 make -p -f /dev/null 。此参数对于学习 makefile 极为重要。

    -r/--no-builtin-rules  禁止 make 的所有隐含规则

    -R/--no-builtin-variabes  禁止 make 使用任何用于变量上的隐含规则

    -w/--print-directory  输出运行 makefile 之前和之后的信息,对于跟踪嵌套调用 make 有用。

    --no-print-directory  禁止 -w

    --warn-undefined-variables  只要make 发现有未定义的变量,就输出警告。

    常用命令前缀:

    @ 不显示命令到屏幕上

    ;  让下一条命令建立在上一条命令执行结果上,如 cd /opt;pwd

    -  忽略命令的错误提示

    条件判断语句和定义命令序列:

    if/ifeq/ifneq/ifdef/ifndef ... else ... endif

    define 命令包名  命令列表  endef

    常用的约定俗成的伪目标名:

    all  所有目标的目标,其功能一般是编译所有的目标

    clean  删除所有被 make 创建的文件

    install  安装已编译好的程序,其实就是把目标执行文件复制到指定的目录中去

    print  列举改变过的源文件

    tar  把源程序打包备份

    dist  创建一个压缩文件,一般是把 tar 文件压成 Z 文件或 gz 文件

    TAGS  更新所有的目标,以备完整的重新编译使用

    check 和 test  测试 makefile 的流程

    引入其它的 makefile 文件: include <filename>

    1、首先寻找 make 执行时有 -I/--include-dir 参数指定的目录

    2、寻找 <prefix>/include (一般是 /usr/local/bin 或 /usr/include ) 目录

    如果文件没有找到,则 make 会生成一条警告信息,但不会马上出现致使错误,它会继续载入其它的文件,一旦完成 makefile 的读取,make 会再重试这些没有找到或是不能读取的文件,如果还不行,才会出现一条致命错误,如果想让 make 忽略无法读取的文件,可以在 include 前面加上 - 的命令前缀。

    依赖文件和目标文件搜索路径:

    1、VPATH 环境变量

    2、vpath 关键字,它比 VPATH 更灵活,可以指定不同格式的文件在不同的目录下搜索。它的使用有三种形式:

    ◆  vpath <pattern> <directories>

         为符合模式的文件指定搜索目录

    ◆  vpath <pattern>

         清除符合模式文件的搜索目录

    ◆  vpath  

         清除所有已被设置好了的文件搜索目录

    变量:

    makefile 中的变量,更确切的说,类似于是宏,而不是通常意义上的变量。

    =/:=/?=/+=   注意这几个变量操作符的区别

    override  关键字修饰的变量,可以覆盖运行 makefile 时由命令行设置的变量

    设置变量的值时,往往因为空格造成很多问题,这时可以利用 # 完成一些明确声明,如  nullstring :=#结束        space :=$(nullstring) #值为一个空格 

    自动化变量:

    $@  目标文件集

    $%  仅当目标是函数库文件时,表示规则中的目标成员名

    $<  依赖文件中的第一个目标名字,如果依赖文件是以模式定义的,则表示符合模式的一系列文件集

    $?   所有比目标新的依赖文件集,以空格分隔

    $^  所有依赖文件集,以空格分隔,如果依赖文件中有重复,则去重复

    $+  同上,不去重复

    $*  表示目标模式文件的主名部分

    $(@D)  表示 $@ 的目录部分(不以斜杠作为结尾)

    $(@F)  表示 $@ 的文件部分

    其它类似的还有 $(*D)/$(*F)/$(<D)/$(<F)/$(^D)/$(^F)/$(?D)/$(?F)

    常用的命令参数变量(默认为空):

    CC  C编译器,默认为 gcc

    CXX  C++母夜叉器,默认为 g++

    CFLAGS  C编译参数

    CXXFLAGS  C++编译参数

    CPPFLAGS  C预处理器参数

    LDFLAGS  链接器参数(如 ld)

    函数:

    一、字符串处理函数

    1、$(subst <from>,<to>,<text>)  返回 <text> 中的 <from> 替换成 <to> 后的字符串

    2、$(patsubst <pattern>,<replacement>,<text>)  同上,模式替换

    3、$(strip <string>)  返回去掉 <string> 字符串开头或结尾的空字符

    4、$(findstring <find>,<int>)  在 <in>字串中查找<find>,若找到返回 <find>,找不到返回空字符串

    5、$(filter <pattern...>,<text>)  返回符合模式 <pattern> 的字串

    6、$(filter-out <pattern...>,<text>)  和上面相反,返回不符合模式 <pattern> 的字串

    7、$(sort <list>)  对 <list> 中的字串进行升序去重复排序,返回排序后的字串

    8、$(word <n>,<text>  返回 <text> 中的第 <n> 个单词,如果 <n> 大于 <text> 的单词数,则返回空字串

    9、$(wordlist <s>,<e>,<text>)  同上,取出多个单词,<s> 和 <e> 是数字

    10、$(words <text>)  返回 <text> 中单词个数

    11、$(firstword <text>)  返回 <text> 中第一个单词

    12、$(join <list1>,<list2>)  将 <list2> 中的子串一一对应的加到 <list1> 的子串后面,如果 <list2> 子串数比 <list1> 多,多出来的 <list2> 子串就直接复制过去,函数返回连接过后的字符串

    二、文件操作函数

    1、$(dir <names...>)  返回文件名序列 <names> 的目录部分

    2、$(notdir <names...>)  返回文件名序列 <names> 的非目录部分

    3、$(suffix <names...>)  返回文件名序列 <names> 的文件名后缀部分

    4、$(basename <names...>)  返回文件名序列 <names> 的文件名前缀部分

    5、$(addsuffix <suffix>,<names...>)  返回文件名序列 <names> 加过后缀 <suffix> 的文件名序列

    6、$(addprefix <prefix>,<names...>)  返回文件名序列 <names> 加过前缀 <suffix> 的文件名序列

    三、条件与循环函数

    $(if <condition>,<then-part>) 或 $(if <condition>,<then-part>,<else-part>)

    $(foreach <var>,<list>,<text>)  将<list>中的单词逐一取出放到<var>所指定的变量中,然后再执行<text>所包含的表达式,每次循环返回的内容由空格隔开,就是该函数的最终返回值。如:

    names:=a b c d

    files:=$(foreach n,$(names),$(n).o)

    则 $(files) 的值就是 "a.o b.o c.o d.o"

    四、其它函数

    $(call <expression>,<parm1>,<parm2>,<parm3>,...)

    $(origin <variable>)

    $(shell <expression>)

  • 相关阅读:
    JavaScript设计模式样例八 —— 适配器模式
    JavaScript设计模式样例七 —— 原型模式
    JavaScript设计模式样例六 —— 抽象工厂模式
    JavaScript设计模式样例五 —— 建造者模式
    JS比较两个时间的时间差
    使用nginx实现纯前端跨越
    npm的使用总结
    优雅的格式化时间显示
    优雅的封装ajax,含跨域
    将自己的域名代理到Gitpages
  • 原文地址:https://www.cnblogs.com/tianyajuanke/p/3381024.html
Copyright © 2011-2022 走看看