Makefile是一系列由目标(Target)、关连(Dependencies)及动作组成的规则集,Make将根据这些规则集来决定如何编译(Compile)各连结(Link)程序等。
Make主要预定义的变量:
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建目期晚
$* 不包含扩展名的目标文件名称
$@ 目标的完整名称
$^ 所有的依赖文件,以空格分开,不包含重复的依赖文件
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
GNU Make参考文档如此复杂跟无趣,让人很难有兴趣深入了解这些规则的内在实施,所幸的是,我们还有automake跟autoconf,这些工具可以帮助工程人员建立符合GNU Make规则的Makefile。
在这里,我重写这些步骤,记录于此,方便查找
- 创建hello目录,创建以下hello文件于此目录
#include <stdio.h>
int main() { printf("Hello, World.\n");
return 0; }
|
- 执行autoscan,这将产生configure.in的雏形文件configure.scan,我们将其改名为configure.in,并修改如下:
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ(2.57) AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([hello.c])
# Checks for programs.
# 这个宏是必须的,它描述了我们将要生成的软件包的名字及其版本.
# PACKAGE是软件包的名字,VERSION是版本号。当你使用make dist命令时
# 它会给你生成一个类似helloworld-1.0.tar.gz的软件发行包,其中就有对
# 应的软件包的名字和版本号。
AM_INIT_AUTOMAKE(hello,1.0)
# Checks for programs.
# 这个宏将检查系统所用的C编译器。 AC_PROG_CC
# Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions.
# 这个宏是我们要输出的Makefile的名字 AC_OUTPUT(Makefile) |
- 执行 aclocal 和 autoconf ,分别会产生 aclocal.m4 及 configure 两个档案
- 创建Makefile.am,内容如下
# 这个是automake的选项。在执行automake时,它会检查目录下是否存在标准# GNU软件包中应具备的各种文件,例如AUTHORS、ChangeLog、NEWS等文件。# 我们将其设置成foreign时,automake会改用一般软件包的标准来检查。
AUTOMAKE_OPTIONS= foreign
# 这个是指定我们所要产生的可执行文件的文件名。
# 如果你要产生多个可执行文件,那么在各个名字间用空格隔开 bin_PROGRAMS= hello
# 这个是指定产生“helloworld”时所需要的源代码。如果它用到了多个源文# 件,那么请使用空格符号将它们隔开。比如需要helloworld.h,
# helloworld.c那么请写成helloworld_SOURCES= helloworld.h
# helloworld.c。 hello_SOURCES= hello.c
|
- 执行 automake --add-missing ,Automake 会根据 Makefile.am 档产生一些档案,包含最重要的 Makefile.in
"--add-missing"的意思是add missing standard files to package
最后执行./configure即可生成Makefile.以上所述内容可大体上帮助我们建立一简单的Makefile,但如果要建立更复杂的Makefile则需要深入autoconf及automake的使用方法,或参考其它开源代码中的configure.in及Makefile.am文件
阅读(833) | 评论(0) | 转发(0) |