当前位置:   article > 正文

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

再谈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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

C语言中:

#if defined(MACRO_CONFIG_FEATURE_A)
printf("MACRO_CONFIG_FEATURE_A on\n"); 
#else
printf("MACRO_CONFIG_FEATURE_A off\n"); 
#endif
  • 1
  • 2
  • 3
  • 4
  • 5

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 #打开
  • 1
  • 2

结论:

  • 灵活运用Makefile变量,以及Makefile变量的2种输入方式。
  • 灵活配合C的宏定义变量可以组合出很多工程实践的结论
  • 任何一种语言条件分支都必不可少,Makefile的事ifeq,C语言的编译系统是 #if defined #ifdef 等,灵活掌握语言的设计底层逻辑,更加通透的理解本质
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/426493
推荐阅读
相关标签
  

闽ICP备14008679号