zoukankan      html  css  js  c++  java
  • Makefile学习(二)条件判断和内嵌函数

    第七章:Makefile的条件执行

    条件语句可是是两个不同的变量、或者变量和常量值的比较;

    7.1例子:

    对变量“CC”进行判断,其值
    如果是“gcc ”那么在程序连接时使用库“libgnu.so”或者“libgnu.a ”,否则不链接任
    何库。

    ……
    libs_for_gcc = -lgnu
    normal_libs =

    ……

    foo: $(objects)

    ifeq ($(CC),gcc)
    $(CC) -o foo $(object s) $(libs_for_gcc)
    else
    $(CC) -o foo $(objects) $(normal_libs)
    endif
    ……

    7.2.1.1关键字ifeq

    通常我们会使用它来判断一个变量的值是否为空(不是任何字符)。参数值可能是
    通过引用变量或者函数得到的,因而在展开过程中可能造成参数值中包含空字符(空格
    等)。

    7.2.1.2关键字ifneq

    7.2.1.3关键字ifdef

    判断一个变量是否已经定义。

    7.2.1.4关键字ifndef

    在除关键字(包括“endif”)之前、条件表达式参数中之外的其他任何地方
    都可以使用多个空格或[Tab]字符,它不会影响条件判断语句的功能。

    7.3标记测试的条件语句

    使用条件判断语句、MAKEFLAGS和函数fingstring实现对make命令行选项的测试

    archive.a: ...
    ifneq (,$(findstring t,$(MAKEFLAGS)))
    +touch archive.a
    +ranlib -t archive.a
    else
    ranlib archive.a
    endif

    判断make命令行参数中是否包含-t,对archice.a执行不同的操作。

    第八章make的内嵌函数

    8.1函数的调用语法

    格式如下:

    $(FUNCTION ARGUMENTS)

    或者:

    ${FUNCTION ARGUMENTS}

    说明:1.对于用户自己的函数需要通过make的call函数来间接调用

    2.“ARGUMENTS”是函数的参数,参数和函数名之间使用若干个空格或者[tab]字符分割

    3.以“$ ”开头,使用成对的圆括号或花括号把函数名和参数括起

    8.2文本处理函数

    $(subst FROM,TO,TEXT) 字符串替换

    $(patsubst PATTERN,REPLACEMENT,TEXT) 模式替换函数

    $(strip STRINT) 去空格函数

    $(findstring FIND,IN) 如果在“IN”之中存在“FIND”,则返回“FIND”,否则返回空。

    $(filter PATTERN…,TEXT) 例子如下

    sources := foo.c bar.c baz.s ugh.h
    foo: $(sources)
    cc $(filter %.c %.s,$(sources)) -o foo

    $(filter-out PATTERN...,TEXT) 

    过滤掉字串“TEXT”中所有符合模式
    “PATTERN”的单词,保留所有不符合此模式的单词。

    $(sort LIST) 给字串“LIST”中的单词以首字母为准进行排序(升序),并取掉重复的单词

    $(word N,TEXT) 返回字串“TEXT”中第“N”个单词

    $(wordlist S,E,TEXT) 

    函数功能:从字串“TEXT”中取出从“S ”开始到“E ”的单词串。“S ”和“E ”
    表示单词在字串中位置的数字

    8.2.10 $(words TEXT) 字算字串“TEXT”中单词的数目。 

    $(firstword NAMES…) 字串“NAMES…”的第一个单词。 

    8.3文件名处理函数

     8.3.1 $(dir NAMES…) 取目录函数—dir。

    $(notdir NAMES…) 取文件名函数

    其他一系列函数:

     $(suffix NAMES…) 取后缀函数$(basename NAMES…) 取前缀函数$(addsuffix SUFFIX,NAMES…) 

    $(addsuffix SUFFIX,NAMES…) 加后缀函数,为“NAMES…”中的每一个文件名添加后缀“SUFFIX”。

    $(addprefix PREFIX,NAMES…)

    $(join LIST1,LIST2) 单词连接函数$(wildcard PATTERN)获取匹配模式文件名函数

    $(wildcard *.c)
    返回值为当前目录下所有.c 源文件列表。、

    8.4foreach函数,它是一个循环函数

    $(foreach VAR,LIST,TEXT) 

    执行时把“LIST”中使用空格分割的单词依次取出赋值给变量
    “VAR ”,然后执行“TEXT”表达式。重复直到“LIST”的最后一个单词(为
    空时结束)。

    8.5if函数

    $(if CONDITION,THEN-PART[,ELSE-PART]) 

    第一个参数“CONDITION”,在函数执行时忽略其前导和结尾空字

    符,如果包含对其他变量或者函数的引用则进行展开。如果“CONDITION”的
    展开结果非空,则条件为真,就将第二个参数“THEN_PATR ”作为函数的计算
    表达式;“CONDITION”的展开结果为空,将第三个参数“ELSE-PART”作为
    函数的表达式,函数的返回结果为有效表达式的计算结果。

    8.6call函数

    使用这个函数可以实现对用户自己定义函数引用

    “call”函数是唯一一个可以创建定制化参数函数的引用函数。

    $(call VARIABLE,PARAM,PARAM,...)

    我们可以将一个变量定义为一个复杂的表达式,用call函数根据不同的参数对它进行展开来获得不同的结果。

    $(value VARIABLE) 提供一种在不对变量进行展开的情况下获取变量值的方法

    8.8eval函数

    eval函数返回值为空,

    函数“eval ”是一个比较特殊的函数。使用它可以在Makefile中构
    造一个可变的规则结构关系(依赖关系链),其中可以使用其它变量和函数。

    8.9origin函数

    函数“origin”的动作不是操作变量(它的参数)。
    它只是获取此变量(参数)相关的信息,告诉我们这个变量的出处(定义方式)。

    $(origin VARIABLE) 返回值:返回“VARIABLE ”的定义方式。用字符串表示。

    函数返回有以下几种:

    1.undefined

    2.default,说明VARIABLE是一个默认定义变量(内嵌变量)

    3.environment,变量“VARIABLE ”是一个系统环境变量,并且make没有使用命令行选项“-e 

    4.environment override,系统环境变量,make使用了-e

    5.file,在某个makefile文件中定义

    6.command line在命令行中定义

    7.override使用该指示符声明的

    8.automatic自动化变量

    8.10shell

    函数shell函数不同于除“wildcard”函数之外的其它函数。make可以使用它来和外部通信。

    8.11make的控制函数

    $(error TEXT…)产生致命错误,并提示“TEXT”信息给用户,并退出make执行

    $(warning TEXT…)

  • 相关阅读:
    Linux ifconfig 命令
    linux sed命令就是这么简单
    让博客园博客自动生成章节目录索引
    linux中cat、more、less命令区别详解
    Linux yum源搭建及配置
    关于java中位运算的左移、右移、无符号右移
    一个老话题,short s=s+1的日常
    C语言移位运算符
    关于异或的一些东西和应用
    指针就算指向了常量也不能修改这个常量
  • 原文地址:https://www.cnblogs.com/preorder69/p/3678892.html
Copyright © 2011-2022 走看看