zoukankan      html  css  js  c++  java
  • 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))

    怕什么真理无穷,进一寸有一寸的欢喜。---胡适
  • 相关阅读:
    各国语言缩写列表,各国语言缩写-各国语言简称,世界各国域名缩写
    How to see log files in MySQL?
    git 设置和取消代理
    使用本地下载和管理的免费 Windows 10 虚拟机测试 IE11 和旧版 Microsoft Edge
    在Microsoft SQL SERVER Management Studio下如何完整输出NVARCHAR(MAX)字段或变量的内容
    windows 10 x64系统下在vmware workstation pro 15安装macOS 10.15 Catelina, 并设置分辨率为3840x2160
    在Windows 10系统下将Git项目签出到磁盘分区根目录的方法
    群晖NAS(Synology NAS)环境下安装GitLab, 并在Windows 10环境下使用Git
    使用V-2ray和V-2rayN搭建本地代理服务器供局域网用户连接
    windows 10 专业版安装VMware虚拟机碰到的坑
  • 原文地址:https://www.cnblogs.com/hujianglang/p/6243547.html
Copyright © 2011-2022 走看看