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 ...
随机推荐
- Vue.js 源码分析(九) 基础篇 生命周期详解
先来看看官网的介绍: 主要有八个生命周期,分别是: beforeCreate.created.beforeMount.mounted.beforeupdate.updated .beforeDes ...
- memory一致性模型
https://homes.cs.washington.edu/~bornholt/post/memory-models.html https://www.cs.cmu.edu/afs/cs/acad ...
- EFLAGS寄存器(标志寄存器)
这篇文章不是从0开始的,前面还有一些汇编基础指令以及进制,我都没写,时间问题,还是今天空闲,我才想补一下博文,后面我陆续会把前面知识点渐渐补上.我不会重0基础讲起,中间会以.汇编.C.C++交叉的形式 ...
- vue国际化问题i18n为null
1.vue的国际化关于使用请看这位大佬的文章https://segmentfault.com/a/1190000015008808 2.this指向问题https://segmentfault.com ...
- JS高阶---执行上下文栈
大纲: 主体: 注意:*******函数调用时才会产生上下文栈,声明时不会产生********** 顺序: 概念图: 执行上下文栈的顺序---→后进先出 其他概念图: 当前执行的上下文总是在顶部 全局 ...
- python gyp
https://github.com/bnoordhuis/gyp 所以,手动加了这个变量 https://blog.csdn.net/weixin_30576827/article/details/ ...
- 简单python爬虫实例
先放上url,https://music.douban.com/chart 这是豆瓣的一个音乐排行榜,这里爬取了左边部分的歌曲排行榜部分,爬虫很简单,就用到了beautifulsoup和request ...
- flask中利用session实现用户记住密码
“记住密码”的实质,实际上就是把cookie的有效期设置的长一点,当用户没有选择记住密码时,cookie的有效期为会话结束,选择记住密码后,会根据服务器的设置延长cookie的有效期,默认是31天.在 ...
- java修饰符的总结
引言:Java的修饰符根据修饰的对象不同,分为类修饰符.方法修饰符.变量修饰符,其中每种修饰符又分为访问控制修饰符和非访问控制修饰符.访问控制存在的原因:a.让客户端程序员无法触及他们不应该触及的部分 ...
- JavaEE 项目部署方式
一.手动部署 二.自动部署 “自动化”的具体体现:向版本库提交新的代码后,应用服务器上自动部署,用户或测试人员使用的马上就是最新的应用程序. 搭建上述持续集成环境可以把整个构建.部署过程自动化,很大程 ...