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 ...
随机推荐
- Java编程基础——数组和二维数组
Java编程基础——数组和二维数组 摘要:本文主要对数组和二维数组进行简要介绍. 数组 定义 数组可以理解成保存一组数的容器,而变量可以理解为保存一个数的容器. 数组是一种引用类型,用于保存一组相同类 ...
- 删除Win10远程桌面中的无用的IP列表
运行中,输入regedit,然后找到这个位置(也可在任务管理器的地址栏中,直接输入下面的地址),便可删除远程桌面中列出的一些无用的IP地址. 计算机\HKEY_CURRENT_USER\Softwar ...
- webpack本地开发起服务只能用localhost和端口号打开,不能用本地ip地址打开
这时候记得在webpack配置文件中 devServer中加host:'0.0.0.0' 或者在启动命令中加 --host 0.0.0.0
- 3. 移动安全渗透测试-(Android基础漏洞)
3.1 数据存储漏洞 用户经常会把敏感数据交给app,比如:用户名and密码认证令牌联系人记录通信记录历史使用记录..... 只要愿意,app可以收集这些用户的隐私和个人信息明文存储或明文传输,通常保 ...
- i春秋CTF-“百度杯”CTF比赛 九月场 XSS平台
“百度杯“CTF比赛 九月场 ###XSS平台 看了别人的wp才知道这里需要变数组引起报错然后百度信息收集,这一步在实战中我觉得是很有作用的,get到. 这里取百度rtiny,看别人w ...
- maven 学习---Maven自动化部署
在项目开发中,通常是部署过程包含以下步骤 检入代码在建项目全部进入SVN或源代码库中,并标记它. 从SVN下载完整的源代码. 构建应用程序. 生成输出要么WAR或EAR文件存储到一个共同的网络位置. ...
- SSH开发模式——Struts2进阶
在之前我有写过关于struts2框架的博客,好像是写了三篇,但是之前写的内容仅仅是struts2的一些基础知识而已,struts2还有很多有趣的内容等待着我们去发掘.我准备再写几篇关于struts2的 ...
- 详解Vue的slot新用法
摘要: 理解Vue插槽. 作者:前端小智 原文:vue 2.6 中 slot 的新用法 Fundebug经授权转载,版权归原作者所有. 为了保证的可读性,本文采用意译而非直译. 最近发布不久的Vue ...
- Python成绩单雷达图
1numpy库 numpy 是 python 的科学计算库 部分功能: 1.使用numpy读取txt文件 # dtype = "str":指定数据格式 # delimiter = ...
- 【NodeJS】Vue-d2Admin
INFO Starting development server... 10% building 2/2 modules 0 active ERROR Error: Watching remote f ...