Autotools

上篇,我们了解了 Makefile 的基本用法,但是要写一个能实际应用的 Makefile 还是一件很繁琐的事情,于是就有 automake 配合 autoconf 这套 autotools 工具来帮我们自动产生 Makefile。

Automake 是一个由 Makfile.am 产生 Makefile.in 的自动化工具,每一个 Makefile.am 都定义了一系列的宏。Automake 需要 perl 来产生 Makefile.in。

最开始的时候,我们手写 Makelfile 来实现程序的编译链接。但是当程序需要在不同的平台上运行时,Makefile 就需要根据平台要求来改变,比如在别的平台上编译器就不再叫 gcc(cc)了,或许是叫其他的名字,即使名字相同,要实现编译所需的选项也可能不同。1991 年,David J.Majenzie 写了一个叫做 configure 的脚本,根据环境的不同自动的产生 Makefile。也因此,现在我们编译一个包,之需要简单的执行 ./configure && make。

上面的这个过程被 GNU 项目所规范,以便更好的被使用。而我们就称这一整套的编译过程叫做 GNU Build System。目前绝大多数的包的编译都会采用该系统,遵循规范。
Continue reading

Makefile

在 Linux 上,一个文件能否被运行,通常是看是否有 “x” 权限,但是真正的可执行文件是二进制的文件,如 /usb/bin/passswd,/bin/touch 等。我们常写的 shell script 其实是利用 shell(如 bash)程序的功能进行的一些判断,而最终运行的时候除了 bash 还有在脚本中调用的一些已经编译好的二进制的程序。

$ file /bin/bash
/bin/bash: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

$ file ver.sh
ver.sh: Bourne-Again shell script text executable

如果是二进制运行的时候,会看到 ELF,shared libs 等字样;而普通的脚本则会显示 text exectable 字样。
Continue reading