例解 autoconf 和 automake 生成 Makefile 文件

https://www.ibm.com/developerworks/cn/linux/l-makefile/

https://blog.csdn.net/u010020404/article/details/82770848

m4介绍

转自:https://blog.csdn.net/joe_007/article/details/8812296

m4是一个通用的宏处理器,由布莱恩·柯林汉和丹尼斯·里奇设计。m4 是基于 Ritchie 早先为 AP-3 小型机开发的m3宏处理器扩展的。

m4 是 POSIX 标准中的一部分,所有版本的 UNIX 下都可用。虽然这种语言可以单独使用,但大多数人需要 m4 仅仅是因为 GNU autoconf 中的 “configure” 脚本依赖它。

历史

宏处理器开始流行的时候,程序员还都在使用汇编语言来编程。在早期,程序员发现他们的程序中包含了很多重复的代码,于是他们创造了这种简单的方法来重用。程序员们很快发现它不仅能用于重用整块代码,还能为类似的参数替换不同的值。这明确了宏处理器的使用范围。

在 1977 年,Kernighan 和 Ritchie 基于 Christopher Strachey 的想法开发了 m4。一些与众不同的特征有:

  • 自由形式的语法(而不是像那些用于处理汇编语言的典型宏处理器一样使用基于行的语法)
  • 高度的宏扩展(宏参数被扩展两次:扫描时一次、插值时一次)

从一开始,Rational Fortran(RatFor) 就使用 m4 作为它的宏引擎,而大多数 UNIX 变种发布时都包含了它。 截止 2009 年,许多应用仍在使用 m4(作为 GNU autoconf 项目的一部分)。它还出现在 sendmail(一个广泛使用的邮件传输代理)的配置过程,以及用于 gEDA 工具包中生成脚印。

m4 大多用于代码生成,和其他宏处理器一样,一旦出了问题会很难调试。

特性

m4 提供如下功能:

  • 语法形式自由,而不是基于行的语法;
  • 高度的宏扩展(宏参数在扫描和插值中都会被扩展)
  • 文本替换
  • 参数替换
  • 文件包含
  • 字符串操作
  • 条件判断
  • 数算运算
  • 系统接口
  • 程序员诊断
  • 独立于计算机编程语言
  • 独立于自然语言
  • 可编程

与大部分早先的宏处理器不同,m4并不面向任何计算机语言或自然语言;但从历史角度来说,它最初是为支持 Fortran的方言Ratfor而开发的。此外,m4 还是一种图灵完备的编程语言。

示例

以下宏代码可生成 HTML 代码:自动为每个章节编号。

divert(-1)
This `divert' discards this text. Note that I had to quote the `divert'
in the comment so it wouldn't get undiverted.

# In a true comment, I'm free to use words such as divert and other builtin
# m4 macros' names without consequence.

# This starts the count at ONE as the incr is a preincrement.
define(`H2_COUNT', 0)

# The H2_COUNT macro is redefined every time the H2 macro is used.
define(`H2',
        `define(`H2_COUNT', incr(H2_COUNT))

H2_COUNT. $1

') divert(0)dnl Diversion to 0 means back to normal. dnl macro removes this line. H2(First Section) H2(Second Section) H2(Conclusion)

上述代码在 m4 中执行,生成以下结果:

1. First Section

2. Second Section

3. Conclusion

dnl 用于删除前面的空行。

自由软件版本

GNU实现了一个 m4 版本;FreeBSD、NetBSD 和 OpenBSD 也提供一个 m4 语言的独立实现版本;此外,OpenSolaris的Heirloom 项目开发工具中也包含了一个 m4 语言的自由版本。

 

你可能感兴趣的:(Linux)