如何自动生成Makefile
如果只是一个很小的程序,没有几个文件,那么,我们手工书写Makefile还是可以忍受的,如果是一个超大型的工程,谁能忍受的了,光一个Makefile文件就足以是Writer头疼了,但也没有人说一定要手工书写makefile文件。linux中提供了自动生成Makefile的工具,而且通过,这些工具生成的makefile还很符合GNU的习惯的。而且功能也很齐全。
自动生成makefile需要些工具来支持:autoscan,aclocal,autoconf,automake如果需要生成动态库还需要libtool。
举例子来说,假如我有test.c,p1.c,p2.c,myheader.h这几个文件,而且test.c需要调用在myheader.h中声明过的p1,p2函数,他们分别有p1.c,p2.c来实现。
首先,进入上面几个文件的目录,然后执行autoscan,autoscan用来扫描源代码目录并生成cinfigure.scan文件,和一个日志文件,但对我们来说有用的是前者:
$autoscan
之后就会生成autoscan.log configure.scan这两个文件,为了简单,我将所有的注释(以#开头)都删除了,打开configure.scan:
AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([p1.c])
AC_CONFIG_HEADER([config.h])
AC_PROG_CC
AC_OUTPUT
然后修改该文件,为后来使用作准备:
AC_INIT(test.c)
AM_INIT_AUTOMAKE(test, 1.0)
AC_PROG_CC
AC_OUTPUT(Makefile)
后面在解释为什么要这么修改。做完上面的工作之后,我们要将configure.scan改名为configure.in让aclocal使用,他是一个perl脚本程序,他根据configure.in文件的内容生成aclocal.m4文件
$aclocal
然后就是生成configure脚本文件,
$autoconf
这样ls后就会有一个configure的可执行的文件。当然,工作到这还没有结束,我们还要写一个Makefile.am文件,用来生成Makefile.in文件。
AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= test
test_SOURCES= test.c p1.c p2.c myheader.h
这样就生成一个Makefile.in的文件,此时运行一下configure脚本就会得到Makefile,打开之后会发现,太丰富了!make一下可执行的test被编译好了。
如果只是一个很小的程序,没有几个文件,那么,我们手工书写Makefile还是可以忍受的,如果是一个超大型的工程,谁能忍受的了,光一个Makefile文件就足以是Writer头疼了,但也没有人说一定要手工书写makefile文件。linux中提供了自动生成Makefile的工具,而且通过,这些工具生成的makefile还很符合GNU的习惯的。而且功能也很齐全。
自动生成makefile需要些工具来支持:autoscan,aclocal,autoconf,automake如果需要生成动态库还需要libtool。
举例子来说,假如我有test.c,p1.c,p2.c,myheader.h这几个文件,而且test.c需要调用在myheader.h中声明过的p1,p2函数,他们分别有p1.c,p2.c来实现。
首先,进入上面几个文件的目录,然后执行autoscan,autoscan用来扫描源代码目录并生成cinfigure.scan文件,和一个日志文件,但对我们来说有用的是前者:
$autoscan
之后就会生成autoscan.log configure.scan这两个文件,为了简单,我将所有的注释(以#开头)都删除了,打开configure.scan:
AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([p1.c])
AC_CONFIG_HEADER([config.h])
AC_PROG_CC
AC_OUTPUT
然后修改该文件,为后来使用作准备:
AC_INIT(test.c)
AM_INIT_AUTOMAKE(test, 1.0)
AC_PROG_CC
AC_OUTPUT(Makefile)
后面在解释为什么要这么修改。做完上面的工作之后,我们要将configure.scan改名为configure.in让aclocal使用,他是一个perl脚本程序,他根据configure.in文件的内容生成aclocal.m4文件
$aclocal
然后就是生成configure脚本文件,
$autoconf
这样ls后就会有一个configure的可执行的文件。当然,工作到这还没有结束,我们还要写一个Makefile.am文件,用来生成Makefile.in文件。
AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= test
test_SOURCES= test.c p1.c p2.c myheader.h
这样就生成一个Makefile.in的文件,此时运行一下configure脚本就会得到Makefile,打开之后会发现,太丰富了!make一下可执行的test被编译好了。