GNU Makefile中的条件控制结构
在常见的编程语言中,使用条件控制结构诸如if ... else if ... else...是很寻常的事情,那么在GNU Makefile中如何使用呢?
- ifeq
- ifneq
例如:foo.sh
#!/bin/bash ARCH=$(uname -p)
if [[ $ARCH == "x86_64" ]]; then
ARCH32="i686"
ARCH64="x86_64"
elif [[ $ARCH == "ppc64le" ]]; then
ARCH32=""
ARCH64="ppc64le"
else
ARCH32=$ARCH
ARCH64=""
fi if [[ -n $ARCH32 ]]; then
OUTPUT+=" ARCH32=$ARCH32"
fi if [[ -n $ARCH64 ]]; then
OUTPUT+=" ARCH64=$ARCH64"
fi echo $OUTPUT
将上述的foo.sh用Makefile实现就是:
ARCH = $(shell uname -p) ifeq ($(ARCH), x86_64)
ARCH32 = i686
ARCH64 = x86_64
else ifeq ($(ARCH), ppc64le)
ARCH32 =
ARCH64 = ppc64le
else
ARCH32 = $(ARCH)
ARCH64 =
endif ifneq ($(ARCH32), )
OUTPUT += ARCH32=$(ARCH32)
endif ifneq ($(ARCH64), )
OUTPUT += ARCH64=$(ARCH64)
endif all: foo
foo:
@echo $(OUTPUT)
运行foo.sh 和 Makefile 结果如下:
$ uname -p
x86_64
$ bash foo.sh
ARCH32=i686 ARCH64=x86_64
$ make -f Makefile
ARCH32=i686 ARCH64=x86_64
由此可见,
- ifeq($(VAR), ) 等价于bash中的 [[ -z $VAR ]]
- ifneq($(VAR), ) 等价于bash中的 [[ -n $VAR ]]
那么,在GNU Makefile中使用条件控制结构有什么用?很简单,对不同的平台提供不同的编译选项或者安装包支持。例如:
- 一个针对不同的平台提供不同的安装包的Makefile
ARCH = $(shell uname -p) ifeq ($(ARCH), x86_64)
ARCH32 = i686
ARCH64 = x86_64
else ifeq ($(ARCH), ppc64)
ARCH32 =
ARCH64 = ppc64
else ifeq ($(ARCH), ppc64le)
ARCH32 =
ARCH64 = ppc64le
else ifeq ($(ARCH), s390x)
ARCH32 =
ARCH64 = s390x
else ifeq ($(ARCH), aarch64)
ARCH32 =
ARCH64 = aarch64
else
ARCH32 = $(ARCH)
ARCH64 =
endif ifneq ($(ARCH32), )
CPKGS32 = libgcc.$(ARCH32)
CPKGS32 += glibc.$(ARCH32)
endif
ifneq ($(ARCH64), )
CPKGS64 = libgcc.$(ARCH64)
CPKGS64 += glibc.$(ARCH64)
endif
CPKGS = $(CPKGS32) $(CPKGS64) all: foo
foo:
@echo $(CPKGS)
参考资料:
GNU Makefile中的条件控制结构的更多相关文章
- Makefile 中:= ?= += =的差别 和条件运行
一:在Makefile中常常看到obj-m := scull.o和KERNELDIR ?= /lib/modules/等不同的赋值方式,如今总结他们的差别: = 是最主要的赋值 := 是覆盖之前 ...
- Makefile中的ifeq 多条件使用
Makefile中的ifeq 多条件使用 网上关于makefile中ifeq的介绍已经很多了,为什么我还要在写这篇文章,因为他们只说了if else两种条件的情况,并没有讲多于两种条件情况的使用. 多 ...
- GNU linux 中makefile那点事
转自陈皓: http://bbs.chinaunix.net/viewthread.php?tid=408225 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为 ...
- Makefile中支持的函数大全
一.描述 Makefile的函数调用,很像变量的使用,也是以"$"来标识的,其语法如下: $(<function> <arguments> ) 或是 ${& ...
- makefile中的自动化变量$@,$%,$
转自:http://www.2cto.com/os/201302/191344.html makefile中的自动化变量$@,$%,$ 自动化变量 模式规则中,规则的目标和依赖文件名代表了一 ...
- makefile 中 $@ $^ %< 使用【转】
转自:http://blog.csdn.net/kesaihao862/article/details/7332528 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 ...
- makefile中的自动化变量 【转】
转自:http://blog.chinaunix.net/uid-28458801-id-3495215.html 自动化变量 模式规则中,规则的目标和依赖文件名代表了一类文件名:规则的命令是对所有这 ...
- Makefile中指示符“include”、“-include”和“sinclude”的区别
转:http://www.cnblogs.com/xmphoenix/archive/2012/02/22/2363335.html 指示符“include”.“-include”和“sinclude ...
- makefile 中 $@ $^ %< 使用
这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助 1.源程序的编译 在L ...
随机推荐
- Mysql使用ReplicationDriver驱动实现读写分离
数据库的主从复制环境已经配好,该要解决系统如何实现读写分离功能了.Mysql的jdbc驱动提供了一种实现ReplicationDriver. 1 数据库地址的两种写法 参考:https://dev.m ...
- Linux性能调优 | 01 平均负载的理解和分析
01 uptime命令 通常我们发现系统变慢时,我们都会执行top或者uptime命令,来查看当前系统的负载情况,比如像下面,我执行了uptime,系统返回的了结果. [root@lincoding ...
- CHIP8模拟器的python3实现-3-指令实现
class Chip8CPU(object): def __init__(self, screen): self.registers = { 'v': [], 'index': 0, 'pc': 0, ...
- Arduino leonardo+esp8266-01作服务端与APP进行数据通信
esp8266-01调试 一.硬件设备 1.USB转TTL 2.esp8266-01 3.杜邦线 4.电脑 二.接线 ESP8266 TTL-USB VCC VCC(最好选择3.3V) CH_PD V ...
- QLineEdit默认提示 setPlaceholderText
Setting this property makes the line edit display a grayed-out placeholder text as long as the text( ...
- Java中关于数据类型的一些问题
Java中关于数据类型的一些问题 总结一下最近笔试遇到的一些关于Java中数据类型的一些问题. 虽然比较基础,但在实际做题却很容易出错的点,而且往往这些题出错了会给面试官很不好的感觉:你的基础不好. ...
- netcore2.2以及netcore3.0下的swagger使用
自从core3.0发布后,中间有很多东西跟以往用到的2.2版本相差特别多,今天主要来说一下swagger不同版本下的使用. swagger就是一个可视化接口工具,为了方便让调用者能够很好的了解接口以及 ...
- 服务器Oracle数据库配置与客户端访问数据库的一系列必要设置
tips:所有路径请对应好自己电脑的具体文件路径. 一.服务器及Oracle数据库设置 1.刚装完的Oracle数据库中只有一个dba账户,首先需要创建一个用户. 2.配置监听,C:\app\Admi ...
- ngx-echarts 图表数据动态更新
使用echarts绘制图表时,初次赋值数据正常展示,重新获取数据之后,图表没有跟着动态刷新.解决的办法是: html文件 <div echarts [options]="chartOp ...
- Rust中的函数调用
注意区别语句和表达式哟. Rust是一门基于表示式的语言,牢记!!! fn main() { println!("Hello world!"); another_function( ...