• C++学习笔记25:makefile文件2


    Makefile文件语法

    行解析:命令按行解析

    命令行的行首字符为Tab键,其他行的行首字符不得为Tab键,但可以使用多个空格缩进

    换行:命令太长时,行尾使用""换行

    注释:行首字符为“#”的文本行

    关闭回显:在行首字符后和命令前添加“@”

    • 未关闭回显时,make会首先回显(打印)命令,然后执行该命令
    • 通常仅在注释和纯显示的echo命令前使用此功能

    include filename:包含其他文件

    • 处理模式与c/c++类似
    • 行首加“-”:忽略文件包含错误

    通配符

    “*”(任意数目的任意字符),例如“*.c”表示所有的.c文件

    “?”(任意一个字符)例如:?.c表示单字符文件名

    “[abc]”(存在括号内的某个字符),例如“lib[abc].c”表示第四个字符为a,b,或者c

    “[0-9]"(存在该集合中的某个字符)

    “[^abc]”(存在非括号内的某个字符)

    变量

    基本变量定义:var_name = value

    $(变量名称):引用变量(中间无多余空格);shell变量用"$$",例如:@echo $$HOME

    变量在使用时展开,形式上类似宏替换

    变量的使用场合:目标,先决条件,命令,新的变量

    内置变量

    $(CC):当前使用的编译器;$(MAKE):当前使用的make工具

    自动变量

    $@:当前目标;$<:当前目标的首个先决条件;

    $?:比目标更新的所有先决条件

    $^:所有先决条件

    $(@D)和$(@F):$@的目录名和文件名;

    $(<D)和$(<F):$<的目录名和文件名

    例子:

    #makefile样本

    objs = main.o library.o

    prog:$(objs)

      $(CC) -o prog $(objs)

      @echo "constructed..."

    main.o:main.c library.h

      $(CC) -c main.c

    library.o:library.c library.h

      $(CC) -c library.c

    .PHONY:clean

    clean:

      rm -f prog $(objs)* ~

    备注:~为生成的备份文件

    变量定义格式

    var_name = value :在执行时扩展,允许递归,可以使用后续代码中出现的值

    var_name = value :在定义时扩展,不允许递归,使用右侧的现值,不能使用后续代码中出现的值

    var_name ?= value:只有在该变量为空时才设置值,否则维持原值

    var_name += value:将值追加到变量的尾部;若变量未定义,则“+=”自动解释为“=” ;若便令已定义,则“+=”继承上次的操作符,并追加新的值

    多行变量

    define var_name

      @echo "One"

      @echo "Two"

    endef

    define 和 endef 行首字符不能为Tab键,对齐时可使用空格

    引用:$(var_name)

    多行变量主要用于定义命令包,使用时要特别小心,展开时有可能导致脚本错误

    目标变量:类似局部变量 ,仅对本目标规则链有效

    -target...:var_name = value:定义目标变量

    静态模式:以“%”通配

    target...:target-pattern:prerequisites...

    [Tab键]commands

    目的:用于处理模式相同的多目标,简化脚本代码

    例子:每个目标的文件以“.o”结尾,先决条件为对应的“.c”

    objs = main.o library.o

    $(objs):%.o:%.c

      $(CC) -c $(CFLAGS) $< -o $@

    以上等价于:

    main.o:main.c

      $(CC) -c $(CFLAGS)main.c -o main.o

    library.o:library.c

      $(CC) -c $(CFLAGS)library.c -o library.o

    条件判断基本格式

    conditional-directive

      text-if-true

    endif

    ----------------------------------

    或者

    conditional-directive

      text-if-true

    else

      text-if-true

    endif

    -------------------------------------

    可用的条件判断

    判断两个参数是否相等

    ifeq(arg1,arg2),ifeq 'arg1' 'arg2'

    ifeq "arg1"  "arg2"

    判断两个参数是否不相等(同上)

    判断某个变量是否已定义:ifdef variable_name

    判断某个变量是否未定义:ifndef variable_name

    循环:可以在makefile中使用shell循环

    rulefor:

      for filename in `echo $(objs)`;

      do

        rm -f $$filename;

      done

    注意事项

      循环为shell循环,为保证多行命令在同一个进程中执行,必须合并成单条命令并在行尾添加分行标示

    可以使用反引号执行命令,所获得的结果集合可以作为循环的处理集合

    filename本身是shell变量,需要使用“$$”引用

    函数:像变量一样使用"$()"标识

    $(function arg1,arg2,...):函数调用,函数名字为function,后跟着逗号分隔的参数列表,函数参数前后不能有多余的空格

    $(subst from,to,text):make的字符串替换函数,将text中的from字符串替换为to,返回替换后的字符串

    例子:

    comma := ,

    #定义空值

    empty:=

    #定义空格

    space := $(empty) $(empty)

    foo := a b c

    #将“a b c”替换为“a,b,c”

    bar := $(subst $(space) $(comma) $(foo))

    怕什么真理无穷,进一寸有一寸的欢喜。---胡适
  • 相关阅读:
    KMP
    837B. Balanced Substring
    JDK7和JDK8新特性
    数据库索引的实现原理
    mysql索引总结----mysql 索引类型以及创建
    Java 8新特性终极指南
    类加载机制
    类加载过程
    深入理解java虚拟机 精华总结(面试)(转)
    几种常用的设计模式介绍(转)
  • 原文地址:https://www.cnblogs.com/hujianglang/p/6243547.html
Copyright © 2020-2023  润新知