自动生成makefile文件学习
1、概论:
1.1 自己写宏文件;
1.2autocof根据宏文件--->configure文件
1.3automake根据另一个宏文件--->makefile.in文件
14.利用configure,根据makefile.in -----> make 文件
2 实践过程:
2.1在~/make_leanging 下面建立helloworld.c的源文件;
2.2 执行autoscan,生成了configure.scan文件,
AC_PREREQ:确保使用足够新的autoconf版本;
AC_INIT:初始化,定义软件的基本信息,包括设置包的全称,版本号以及报告BUG时需要用的邮箱地址;
AC_CONFIG: 用来侦测所指定的源码文件是否存在,来确定源码目录的有效性
AC_CONFIG_HEADER: 用于生成config.h文件,以便autoheader使用;
AC_OUTPUT:创建输出文件。在`configure.in'的末尾调用本宏一次;
2.3修改相应的内容;
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.65])
AC_INIT(helloworld, 1.0, 562600484@qq.com)
AC_CONFIG_SRCDIR([helloworld.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE(helloworld,1.0)
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT(Makefile)
2.4运行 aclocal, 生成一个“aclocal.m4”文件和一个缓冲文件夹autom4te.cache,该文件主要处理本地的宏定义
2.5运行 autoconf, 目的是生成 configure
2.6运行运行 autoheader,它负责生成config.h.in文件。该工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因此此处没有附加符号定义,所以不需要创建“acconfig.h”文件;
------------------------------------configure文件已经生成了------------------
------------------------------下面为生成makefile.in文件-----------------------
2.7 建立Makefile.am文件,内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=helloworld
helloworld_SOURCES=helloworld.c
AUTOMAKE_OPTIONS为设置automake的选项。由于GNU(在第1章中已经有所介绍)对自己发布的软件有严格的规范,比如必须附 带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreign、gnu和gnits,让用 户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件。
bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。
main_SOURCES定义“main”这个执行程序所需要的原始文件。如果”main”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原 始文件都列出来,并用空格隔开。例如:若目标体“main”需要“main.c”、“sunq.c”、“main.h”三个依赖文件,则定义 main_SOURCES=main.c
sunq.c main.h。要注意的是,如果要定义多个执行文件,则对每个执行程序都要定义相应的file_SOURCES。
2.8运行automake --add-missing
2.9 ./configure
2.10 make这样生成了helloworld 的执行程序执行./helloworld就执行了。
-------------------------------------------------------------------------------
3 makefile.am文件的编写
在上一个例子中,我们只是很简单的编写了一个makefile。am文件,当源文件很多的时候就不一样了其中还有其他很多的宏定义可以使用,包括
文件类型 | 书写格式 |
---|---|
可执行文件 | bin_PROGRAMES = foo |
foo_SOURCES = xxxx.c | |
foo_LDADD = | |
foo_LDFLAGS = | |
foo_DEPENDENCIES = | |
静态库 | lib_LIBRARIES = libfoo.a |
foo_a_SOURCES = | |
foo_a_LDADD = | |
foo_a_LIBADD = | |
foo_a_LDFALGS = | |
头文件 | include_HEADERS = foo.h |
数据文件 |
data_DATA = data1 data2 |
Makefile.am还提供了一些全局变量供所有的目标体使用 :
变量 | 含义 |
---|---|
INCLUDES | 比如链接时所需要的头文件 |
LDADD | 比如链接时所需要的库文件 |
LDFLAGS | 比如链接时所需要的库文件选项标志 |
EXTRA_DIST | 源程序和一些默认的文件将自动打入 .tar.gz 包,其他文件若要进入 .tar.gz 包可以使用这种方法,如配置文件,数据文件等。 |
SUBDIRS | 处理本目录前要递归处理哪些子目录 |