通常在kernel或uboot中, 有很多以CONFIG_*开头的宏配置选项,并且保存在相应的头文件中,那么这些CONFIG_*是怎么生成的呢?

在uboot的顶层Makefile中,有这么一项:

此段的作用就是将相关头文件中的宏CONFIG_*保存在include/autoconf.mk中。

涉及两个大类:

1. gcc 的预处理选项:-dM

不做实际的预处理,仅仅列出所有#define的宏,这些宏大部分与体系结构和GNU相关,或来自所包含的头文件。

2.sed

通过sed,将所有输出的宏过滤,得到需要的宏。

示例:

test.h

  1. #include <stdio.h>
  2. #define CONFIG_SERIAL_MULTI 1
  3. # define CONFIG_AAA
  4. #define CONFIG_CACHE_LINE_SIZE (64)
  5. #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
  6. #define ROUND(a,b) (((a) + (b) - 1) & ~((b) - 1))
  7. #define CONFIG_HAS_POST
  8. #define CONFIG_____
  9. #define CONFIG_a "HELLO WORLD"
  10. #define CONFIG_B "123"

define2mk.sed

  1. #
  2. # Sed script to parse CPP macros and generate output usable by make
  3. #
  4. # It is expected that this script is fed the output of 'gpp -dM'
  5. # which preprocesses the common.h header files and outputs the final
  6. # list of CPP macros (and whitespace is sanitized)
  7. #
  8.  
  9. # Only process values prefixed with #define CONFIG_
  10. /^#define CONFIG_[A-Za-z0-9_][A-Za-z0-9_]*/ {
  11. ## Strip the #define prefix
  12. s/#define *//;
  13. # Change to form CONFIG_*=VALUE
  14. s/ */=/;
  15. ## Drop trailing spaces
  16. s/ *$//;
  17. ## drop quotes around string values
  18. s/="\(.*\)"$/=\/;
  19. ## Concatenate string values
  20. s/" *"//g;
  21. ## Assume strings as default - add quotes around values
  22. s/=\(..*\)/="\1"/;
  23. ## but remove again from decimal numbers
  24. s/="\([0-9][0-9]*\)"/=\/;
  25. ## ... and from hex numbers
  26. s/="\(0[Xx][0-9a-fA-F][0-9a-fA-F]*\)"/=\/;
  27. ## Change '' and empty values to "y" (not perfect, but
  28. ## supports conditional compilation in the makefiles
  29. s/=$/=y/;
  30. s/=$/=y/;
  31. # print the line
  32. p
  33. }

执行gcc  -E -dM test.h | sed -n -f define2mk.sed,得到

对于define2mk.sed的说明:

-f <script文件>或--file=<script文件>:以选项中指定的script文件来处理输入

-n 仅显示<script>处理后的结果,如果没有加上这个选项,没有被处理的输入行也会被输出。

  1. /^#define CONFIG_[A-Za-z0-9_][A-Za-z0-9_]*/---这一部分表示由 #define CONFIG_[任意字母数字下划线][任意字母数字下划线]的任意字符串开头的宏定义 将会被替换处理

CONFIG_*头文件的配置的更多相关文章

  1. KEIL中头文件使用配置向导

    在xxx.h头文件的代码中夹杂的“<h>      </h>”.“<o>”“<i>”.“<c1>   </c>”和“<e& ...

  2. UNIX环境高级编程 apue.h头文件的配置

    http://jimslinbing.blog.163.com/blog/static/85054319201292712414518/ 1.到http://www.apuebook.com下载源码2 ...

  3. Spring的配置文件ApplicationContext.xml配置头文件解析

    Spring的配置文件ApplicationContext.xml配置头文件解析 原创 2016年12月16日 14:22:43 标签: spring配置文件 5446 spring中的applica ...

  4. cmake之Visual studio无法显示头文件

    本文演示cmake版本:3.18 1. 问题 使用cmake创建的Visual Studio 项目都没有显示头文件, 比如: 可以清楚的看见,项目lib_pipe没有显示头文件 2. 配置CMakeL ...

  5. 配置apue的头文件apue.h和unp的头文件anp.h

    配置apue的头文件apue.h和unp的头文件anp.h 如果要使用gcc -g 来生成可调试文件一定要修改Make.defines.linux文件中的CFLAGS变量 修改为:CFLAGS=-an ...

  6. 【转】【Raspberry Pi】Unix NetWork Programming:配置unp.h头文件环境

    一.初衷 近期正在做网络计算编程的作业.要求平台为unix/linux,想着Raspberry Pi装的Debian系统也是Linux改的,也应该能够勉强用着,所以就用它来做作业了! 二.说明 先把环 ...

  7. 驱动lx4f120h,头文件配置,没有完全吃透,望指点

    来了块开发板,没接触过,希望能驱动起来,就首先试一下驱动LED,没想到刚开始建好工程问题就来了 使用GPIO驱动,首先想到的是关于GPIO的头文件gpio.h,事实上这个还不够,还需要设置一下系统的配 ...

  8. Qt工程pro文件的简单配置(尤其是第三方头文件和库)

    Qt开发中,pro文件是对正工程所有源码.编译.资源.目录等的全方位配置的唯一方式,pro文件的编写非常重要,以下对几个重要项进行说明(win和linux,mac平台通用配置) 注释 以”#”开始的行 ...

  9. GCC 环境变量 & eclipse CDT 头文件配置

     转:http://blog.csdn.net/statdm/article/details/7751000 GCC 环境变量 & eclipse CDT 头文件配置   在unix 下使用e ...

随机推荐

  1. 1.2(Spring学习笔记)Spring中的Bean

    一.<Bean>的属性及子元素 在1.1中我们对<Bean>有了初步的认识,了解了一些基本用法. 现在我们进一步理解<Bean>属性及子元素. 我们先来看下< ...

  2. 1.1(学习笔记)Servlet简介及一个简单的实例

    一.Servlet简介 Servlet是使用Java语言编写的服务器端程序,可以生产动态的Web界面. 主要运行在服务器端,Servlet可以方便的处理客户端传来的HTTP请求,并返回一个响应. 二. ...

  3. 如何提高码农产量,基于ASP.NET MVC的敏捷开发框架之移动端开发随笔二

    前言 在前一篇文章中我已经做过开篇,接下来的随笔会详细讲一下我们的开发框架是如何实现的,专业的事由专业的人来讲,以后就由我们的高级码农小李英文名查尔斯和他的师父厂长(因为姓陈,酷爱摄影,我们的文艺片都 ...

  4. javascript模块化有什么意义?

    以前,所有的javascript都写在一个文件里,方便只加载一个文件就可以了,但是代码越来越多,必须分成多个文件加载,类似: <script src="1.js">&l ...

  5. Android性能调优篇之探索JVM内存分配

    开篇废话 今天我们一起来学习JVM的内存分配,主要目的是为我们Android内存优化打下基础. 一直在想以什么样的方式来呈现这个知识点才能让我们易于理解,最终决定使用方法为:图解+源代码分析. 欢迎访 ...

  6. Protostuff序列化工具类

    源代码 package org.wit.ff.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStre ...

  7. leetcode练习之No.7------ 翻转整数reverse_integer

    原文地址:http://www.niu12.com/article/48 git地址:git@github.com:ZQCard/leetcode.git 给定一个 32 位有符号整数,将整数中的数字 ...

  8. 安装office2016 64位时提示64位与32位的office程序不兼容,在系统是64位的情况下,由于应用的需要,必须装64位的office,怎么办

    解决办法如下: 如果是,那就看看32位的能不能安装了,要是能,就重新安装一次,把所有组件全部安装,然后,在进行卸载,一般可以卸载成功 如果卸载不成功,这个时候再使用微软的专用卸载工具,——要认清,一定 ...

  9. shell脚本编写注意事项

    shell中赋值变量时不能有空格 之前写python写习惯了 test = ‘free -m’ 在shell中不能有空格 test='free -m' 而且使用管道符之前要留空格 test='free ...

  10. http://blog.sina.com.cn/s/blog_628cc2b70102v115.html

    http://blog.sina.com.cn/s/blog_628cc2b70102v115.html