提笔简要记录方法
快速回忆要点
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)
工程方法:
- 默认情况可以通过config区进行y n的配置
- 如果与默认配置不一样希望其他编译方式,可以直接使用make命令行指定变量后覆盖内部的?= 比如:
make CONFIG_FEATURE_A=n #不打开
make CONFIG_FEATURE_A=y #打开
结论:
- 灵活运用Makefile变量,以及Makefile变量的2种输入方式。
- 灵活配合C的宏定义变量可以组合出很多工程实践的结论
- 任何一种语言条件分支都必不可少,Makefile的事ifeq,C语言的编译系统是 #if defined #ifdef 等,灵活掌握语言的设计底层逻辑,更加通透的理解本质