目录

  • makefile写法
  • 1. 简介
  • 2. 上路之前
  • 3. 一个简单的例子
  • 4.说明:
    • 4.1、autoscan
    • 4.2、 configure.scan
    • 4.3、aclocal
    • 4.4、autoconf
    • 4.5、Makefile.am
    • 4.6、 automake
    • 4.7、Makefile

makefile写法

在 Unix 上写程式的人大概都碰过 Makefile,尤其是用 C 来开发程式的人。用 make来开发和编译程式的确很方便,可是要写出一个 Makefile就不简单了。偏偏介绍 Makefile 的文件不多,GNU Make 那份印出来要几百页的文件,光看完 Overview 就快阵亡了,难怪许多 人闻 Unix 色变。
本文将介绍如何利用 GNU Autoconf 及 Automake 这两套软体来协助我们『自动』产生 Makefile 档,并且让开发出来的软体可以像 Apache, MySQL 和常见的 GNU 软体一样,只要会 ./configure'',make’’, ``make install’’ 就可以把程式安装到系统中。如果您有 心开发 Open Source 的软体,或只是想在 Unix 系统下写写程式。希望这份介绍文件能帮助您轻松地进入 Unix Programming 的殿堂。

1. 简介

Makefile 基本上就是『目标』(target), 『关连』(dependencies) 和『动作』三者所组成的一连串规则。而 make 就会根据 Makefile 的规则来决定如何编译 (compile) 和连结 (link) 程式。实际上,make 可做的不只是编译和连结程式,例如 FreeBSD 的 port collect ion 中, Makefile 还可以做到自动下载原始程式套件,解压缩 (extract) ,修补 (patch),设定,然後编译,安装至系统中。
Makefile 基本构造虽然简单,但是妥善运用这些规则就也可以变出许多不同的花招。却也因此,许多刚开始学习写 Makefile 时会感到没有规范可循,每个人写出来的 Makefile 长得都不太一样,不知道从何下手,而且常常会受限於自己的开发环境,只要环境变数不同或路 径改一下,可能Makefile 就得跟着修改。虽然有 GNU Makefile Conventions (GNU Makefile 惯例) 订出一些使用 GNU 程式设计时撰写 Makefile 的一些标准和规范,但是内容很长而且很复杂, 并且经常做些调整,为了减轻程式设计师维护 Makefile 的负担,因此有了Automake。

程式设计师只需写一些预先定义好的巨集 (macro),交给 Automake 处理後会产生一个可供Autoconf 使用的 Makefile.in 档。再配合利用Autoconf 产生的自动设定档 configure即可产生一份符合 GNU Makefile惯例的 Makeifle 了。

2. 上路之前

在开始试着用 Automake 之前,请先确认你的系统已经安装以下的软体: 1. GNU Automake 2. GNU Autoconf 3. GNU m4 4. perl 5. GNU Libtool (如果你需要产生 shared library)
我会建议你最好也使用 GNU C/C++ 编译器 、GNU Make 以及其它 GNU 的工具程式来做为开发的环境,这些工具都是属於 Open Source Software不仅免费而且功能强大。如果你是使用Red Hat Linux 可以找到所有上述软体的 rpm 档,FreeBSD 也有现成的 package 可以直 接安装,或着你也可以自行下载这些软体的原始档回来 DIY。以下的范例是在 Red Hat Linux 5.2 + CLE2 的环境下所完成的。

3. 一个简单的例子

Automake 所产生的 Makefile 除了可以做到程式的编译和连结,也已经把如何产生程式文件(如 manual page, info 档及 dvi 档) 的动作,还有把原始程式包装起来以供散 的动作都考虑进去了,所以原始程式所存放的目录架构最好符合 GNU 的标准惯例,接下来我拿hello.c 来做为例子。
在工作目录下建立一个新的子目录 devel'',再在 devel 下建立一个hello’’ 的子目录,这个目录将作为我们存放 hello 这个程式及其相关档案的地方:
% mkdir devel
% cd devel
% mkdir hello
% cd hello

用编辑器写个 hello.c 档,

#include <stdio.h>

int main(int argc, char *argv[])
{
printf(“Hello GNU!\n”);
return 0;
}

接下来就要用 Autoconf 及 Automake 来帮我们产生 Makefile 档了。

1、用 autoscan 产生一个 configure.in 的雏型,执行 autoscan 後会产生一个configure.scan 的档案,我们可以用它做为configure.in档的蓝本。
.
2、 编辑 configure.scan 档,如下所示,并且把它的档名改成configure.in
autoconfig用户参考手册 http://www.gnu.org/software/autoconf/manual/autoconf.html
automake用户参考手册 http://www.gnu.org/software/automake/manual/automake.html
修改后的configure.in文件内容如下:

.# -- Autoconf --
.# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])

.# 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_CONFIG_FILES(Makefile)
AC_OUTPUT

上面以AC开头的宏来自autoconf,以AM开头的宏来自automake。要从autoconf或 automake中寻求帮助,这一点很有用。以GNOME开头的宏来自于Gnomemacros目录。这些宏都是用m4宏语言写的。如果将 autoconf和automake安装在/usr目录下,autoconf和automake中的标准宏一般放在/usr/share/aclocal 目录下。

3、 执行 aclocal 和 autoheader ,分别会产生 aclocal.m4 及 configure.h.in 两个档案
% aclocal
% autoheader
注意:要修改文件名

4、编辑 Makefile.am 档,内容如下 :

.# cat Makefile.am
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = hello
hello_SOURCES = hello.c
hello_CPPFLAGS = -I /usr/include/

5、 执行 automake --add-missing ,Automake 会根据 Makefile.am 档产生一些档案,包含最重要的 Makefile.in
% automake --add-missing

configure.ac:11: installing ‘./compile’
configure.ac:6: installing ‘./install-sh’
configure.ac:6: installing ‘./missing’
Makefile.am: installing ‘./depcomp’

6. 执行 autoconf 得到 configure可执行脚本文件

% autoconf

7. 执行测试:

执行./configure
执行 make 此时应该已经生成可执行文件,ls看一下
执行 make install


8. 测试程序:#可执行文件
make clean 清除编译过程生成的文件
make uninstall 卸载

4.说明:

4.1、autoscan

autoscan是 用来扫描源代码目录生成configure.scan文件的 .autoscan可以用目录名做为参数,但如果你不使用参数的 话,那么autoscan将认为使用的是当前目录.autoscan将扫描你所指定目录中的 源文件,并创建configure.scan文件。

4.2、 configure.scan

configure.scan包含了系统配置的 基本选项,里面都是 一些宏定义.我们需要将它改名configure.in

4.3、aclocal

aclocal是 一个perl 脚本程序.aclocal根据configure.in文件的 内容,自动生成aclocal.m4件.aclocal的 定义是 :“aclocal - create aclocal.m4 by scanning configure.ac”.

4.4、autoconf

autoconf是 用来产生configure文件的 .configure是 一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的 系统来产生合适的 Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来.configure.in文件的 内容是 一些宏,这些宏经过autoconf 处理后会变成检查系统
特性.环境变量.软件必须的 参数的 shell脚本.configure.in文件中的 宏的 顺序并没有规定,但是 你必须在 所有宏的 最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏.
  在 configure.ini中:
  #号表示注释,这个宏后面的 内容将被忽略.
  
AC_INIT(FILE)
  这个宏用来检查源代码所在 的 路径.
  
AM_INIT_AUTOMAKE(PACKAGE, VERSION)
   这个宏是 必须的 ,它描述了我们将要生成的 软件包的 名字及其版本号:PACKAGE是软件包
的名字,VERSION是 版本号.当你使用make dist命令时,它会给你生成一个类似helloworld-1.0.tar.gz的 软件发行包,其中就有对应的 软件包的 名字和版本号.

AC_PROG_CC
  这个宏将检查系统所用的 C编译器.
  
AC_OUTPUT(FILE)
  这个宏是 我们要输出的 Makefile的 名字.我们在 使用automake时,实际上还需要用到其他的 一些宏,但我们可以用aclocal 来帮我们自动产生.执行aclocal后我们会得到aclocal.m4文件.产生了configure.in和aclocal.m4 两个宏文件后,我们就可以使用autoconf来产生configure文件了.

4.5、Makefile.am

Makefile.am是 用来生成Makefile.in的 ,需要你手工书写.Makefile.am中定义了一些内容:
AUTOMAKE_OPTIONS
  这个是 automake的 选项.在 执行automake时,它会检查目录下是 否存在 标准
GNU软件包中应具备的各种文件,例如AUTHORS.ChangeLog.NEWS等文件.
我们将其设置成foreign时,automake会改用一般软件包的 标准来检查.

bin_PROGRAMS
  这个是 指定我们所要产生的 可执行文件的 文件名.如果你要产生多个可执行文件,
那么在各个名字间用空格隔开.

helloworld_SOURCES
  这个是 指定产生"helloworld"时所需要的 源代码.如果它用到了多个源文件,
那么请使用空格符号将它们隔开.比如需要helloworld.h,helloworld.c那么请写成:
helloworld_SOURCES= helloworld.h helloworld.c.
  如果你在 bin_PROGRAMS定义了多个可执行文件,则对应每个可执行文件都要定义相对的filename_SOURCES.

4.6、 automake

我们使用automake --add-missing来产生Makefile.in.选项–add-missing的 定义是 “add missing standard files to package”,它会让automake加入一个标准的 软件包所必须的 一些文件.
  我们用automake产生出来的 Makefile.in文件是 符合GNU Makefile惯例的 ,接下来我们只要执行configure这个shell 脚本就可以产生合适的 Makefile 文件了.

4.7、Makefile

在 符合GNU Makefiel惯例的 Makefile中,包含了一些基本的 预先定义的 操作:

make
  根据Makefile编译源代码,连接,生成目标文件,可执行文件.
  
make clean
  清除上次的 make命令所产生的 object文件(后缀为".o"的 文件)及可执行文件.
  
make install
  将编译成功的 可执行文件安装到系统目录中,一般为/usr/local/bin目录.
  
make dist
  产生发布软件包文件(即distribution package).这个命令将会将可执行文件及相关
文件打包成一个tar.gz压缩的 文件用来作为发布软件的 软件包.它会在 当前目录下生成一个名字类似"PACKAGE-VERSION.tar.gz"的 文件.PACKAGE和VERSION,是 我们在 configure.in中定义的 AM_INIT_AUTOMAKE(PACKAGE, VERSION).

make distcheck
  生成发布软件包并对其进行测试检查,以确定发布包的正确性.

关于Makefile,Makefile.in,Makefile.am,Configure功能及相互关系的问题相关推荐

  1. Makefile.am和makefile.in生成Makefile

    很多时候,我们在网上下载的linux开源软件都会遇到一个问题,就是源码里面没有直接的makefile,但是它有Makefile.am和makefile.in或者它有Makefile.am和config ...

  2. 什么是Makefile.am和Makefile.in?

    本文翻译自:What are Makefile.am and Makefile.in? These two files are mostly seen in open source projects. ...

  3. Makefile文件:Makefile介绍

    本文介绍Makefile的一些基本概念以及简单的用法.本文所用的编译器是Hightec tricore v4.9.1.0. 文章目录 1 Makefile的作用 2 Makefile的规则 3 一个简 ...

  4. (三)《跟我一起写Makefile》之Makefile总述

    前往我的个人博客,阅读体验更佳. Makefile 总述 Makefile 里有什么? Makefile 里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 显式规则.显式规则说明了 ...

  5. makefile的使用方法(简单视频教程以及详细文字教程)(makefile教程、makefile教学)

    文章目录 1.makefile详细文字教程 2.makefile简单教程(B站视频教程) makefile基本语法格式: 简单示例(单文件)makefile写法 带包含关系的多文件makefile写法 ...

  6. linux中makefile高级用法--makefile调用makefile

    一.介绍 在大型项目中,makefile调用makefile很常见,也很方便,这里给出调用方法 二.实例 1.代码树 app_top下,有顶层makefile和编译工具的设置文件Rules.make, ...

  7. 基于pyqt5的登录界面及人脸识别功能界面相互跳转的设计(1)

    基于pyqt5的登录界面及人脸识别功能界面相互跳转的设计(1) 这个是登录界面: 部分代码如下: // An highlighted block from 文件1 import * from PyQt ...

  8. eLife: 脑岛的微观结构与宏观功能环路相互联系并能预测认知控制

    <本文同步发布于"脑之说"微信公众号,欢迎搜索关注~~> 一.导读 人类的脑岛是一个在内部具有明显异质性的脑部结构,在认知行为控制中发挥着整合作用.上个世纪,脑岛的细胞 ...

  9. Makefile.am、Makefile.in、Makefile、configure.ac关系(十二)

    1.Makefile.am: 是一些编译的选项及要进行编译的文件项. bin = test LIBRARIES = libtest.a SOURCES = test.c2.Makefile.in: 是 ...

最新文章

  1. F# 4.5提供Spans、Match!等特性
  2. import static
  3. 深度学习时间序列预测:GRU算法构建单变量时间序列预测模型+代码实战
  4. Elasticsearch本地 docker-compose 安装
  5. java反编译工具jadclipse_java反编译工具jad及jadclipse
  6. java ajax无刷分页_asp.net+ajax+json来实现无刷新分页功能
  7. hadoop data join
  8. 百度智能云开物再收“一个奖状”
  9. php查询类似abab,ABAB中的正则表达式匹配编号(必须相同) - php
  10. Spring MVC:MySQL和Hibernate的安全性
  11. 解决:Do not use built-in or reserved HTML elements as component id: form
  12. GDI+ 应用,Release没有错误,Debug很多。
  13. C++读写文件总结 .
  14. thinkphp在IIS7.5+环境下部署出现的URL重写问题解决方法
  15. Fragment与Radiogroup联动,经典的主界面布局。使用show和hide的方式实现;
  16. 解决方案:awesomium web-browser frameworkThis View has crashed!
  17. java rfc接口_java调用sap的RFC接口
  18. 依据Right-BICEP要求的对四则运算2的测试
  19. 亚马逊运营listing优化A+页面
  20. struct dst_entry *dst

热门文章

  1. antd Datepicker组件报错 ——date.clone is not a function或者date1.isAfter is not a function
  2. 房价在手,天下我有 --反手就撸一个爬虫(终)
  3. transition
  4. Qt学习之路(4):初探信号槽
  5. easyui 插入中间行
  6. Struts2中数据封装方式
  7. C++服务器设计(七):聊天系统服务端实现
  8. lr_start_timer,lr_get_transaction_duration,lr_get_transaction_wasted_time函数使用总结
  9. ADO.NET数据集添加虚拟字段
  10. 阿诗玛的传说|阿诗玛民间故事