再谈Makefile和C的2种变量和3个空间和2种if的工程实践中的常见用法的模板

提笔简要记录方法

快速回忆要点

2个变量:makefile变量(命令行和文件中)与C宏定义变量
3个空间:命令行空间、Makefile文件中、C文件中
2种if:ifeq、if defined

命令行

  • make CONFIG_FEATURE_A=n

Makefile中

  • CONFIG_FEATURE_A ?= y
  • ifeq ($(CONFIG_FEATURE_A), y)
  • CFLAGS += -D123 -DMACRO_CONFIG_FEATURE_A

C 语言中:

  • #if defined(MACRO_CONFIG_FEATURE_A)

要点

Makefile通过CONFIG变量或者命令行参数,进行配置是否编译某些代码或者编译参数,同步传递给C语言的GCC宏定义

模板

Makefile中:

## 配置定义区 start ?表示如果命令行或者其他地方定义了可以直接使用配置的
CONFIG_FEATURE_A ?= y
CONFIG_FEATURE_UNIT_TEST ?= y# 注意这里如果有注释y和#之间不能有空格
## 配置定义区 end

# 显示配置信息
$(info CONFIG_FEATURE_A=$(CONFIG_FEATURE_A))

# 使用配置信息
ifeq ($(CONFIG_FEATURE_A), y)
srcs += 1.c \
	feature_a.c
else
srcs += 1.c \
	feature_a.c
endif

# 根据配置信息传递给C的宏定义

ifeq ($(CONFIG_FEATURE_A), y)
CFLAGS += -D123 -DMACRO_CONFIG_FEATURE_A
else
CFLAGS += -D123
endif

C语言中:

#if defined(MACRO_CONFIG_FEATURE_A)
printf("MACRO_CONFIG_FEATURE_A on\n"); 
#else
printf("MACRO_CONFIG_FEATURE_A off\n"); 
#endif

C语言中还可以更加灵活的增加变量的方式
#if defined(CFG_XXX_TYPE) && (CFG_XXX_TYPE == 1)

工程方法:

  1. 默认情况可以通过config区进行y n的配置
  2. 如果与默认配置不一样希望其他编译方式,可以直接使用make命令行指定变量后覆盖内部的?= 比如:
make CONFIG_FEATURE_A=n #不打开
make CONFIG_FEATURE_A=y #打开

结论:

  • 灵活运用Makefile变量,以及Makefile变量的2种输入方式。
  • 灵活配合C的宏定义变量可以组合出很多工程实践的结论
  • 任何一种语言条件分支都必不可少,Makefile的事ifeq,C语言的编译系统是 #if defined #ifdef 等,灵活掌握语言的设计底层逻辑,更加通透的理解本质
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值