2019独角兽企业重金招聘Python工程师标准>>>

详解linux下auto工具制作Makefile源码包(制作篇)

水木杨

一、     概述

为了更好的制作configure与Makefile,我先把制作流程给写在这里,好让大伙都有个心理准备。这里只说流程,不做解释。(附图供参考)

1、autosan命令生成configure.scan文件,这只是个模板,我们重新编辑这个文件,并把它保存为configure.in文件。

2、aclocal命令生成aclocal.m4文件。

3、autoheader命令生成config.h.in。前提是aclocal.m4和configure.in必须生成。

4、autoconf命令生成configure文件(这个文件都很熟悉吧,嘎嘎)。

5、创建并编辑Makefile.am,这个文件在根目录与子目录都应该有的。

6、automake命令生成Makefile.in。

7、./configure命令,根据Makefile.in生成Makefile文件,这个再熟悉不过了吧。

二、     制作

巧妇难做无米之炊,要想完成这次体验,我们还得按规矩一步一步来,源文件得有。首先建个目录Family用来放我们的东西,它下面的东西就多了。源代码什么阿c,阿h啊,都放在src下面,src这个文件夹命名一般都是约定俗成的,我们也不破坏。当然你也可以起其他名字,别搞忘就好。

<Family>
|-configure.in
|-Makefile.am
|-<src>
|-wife.c
|-daughter.c                                                                   |-main.c
|-wife.h                                                                       |-daughter.h
|-Makefile.am

※说明:
1. configure.in 这是最重要的文档,整个安装过程都靠它来主导。
2. Makefile.am automake会根据它来生成Makefile.in,再由./configure Makefile.in变成最终的Makefile,一般来说在顶级目录和各个子目录都应该有一个Makefile.am
3. wife.c daughter.c main.c wife.h daughter.h 这是我们的源程序。

不用细看,这些文件除了configure.in是用模板创建手动编辑外,其他都是手动创建并编辑的,如果你还木有,动手吧。其实这里边有个小小的经验,也不一定是对的,只是个人的经验,也就是后缀名为in的文件是生成的模板。

$ mkdir –p Family/src

$ touch Makefile.am

$ cd src

$ touch wife.c daughter.c main.c wife.h daughter.h Makefile.am

$ cd ..  进入刚创建的Family目录

$ autoscan 该命令产生 configure.scan 和 configure.log两个文件,然后

$ mv configure.scan configure.i n这样configure.in就创建成了。

源代码内容:

main.c:

#include <stdio.h>

#include "wife.h"

#include "daughter.h"

#ifdef HAVE_CONFIG_H

#include <config.h>

#endif

int main(void)

{

printf( "These are my girls/n");

daughter_say();

wife_say();

return 0;

}

daughter.c

#include <stdio.h>

#include "daughter.h"

#ifdef HAVE_CONFIG_H

#include <config.h>

#endif

void daughter_say(void)

{

printf("My Dad ,are you call me ?/n");

}

daughter.h

#ifndef _DAUGHTER_

#define _DAUGHTER_

void daughter_say(void);

#endif

wife.c

#include <stdio.h>

#include "wife.h"

#ifdef HAVE_CONFIG_H

#include <config.h>

#endif

void wife_say(void)

{

printf("My darling ,are you call me ?/n");

}

wife.h

#ifndef _WIFE_

#define _WIFE_

void wife_say(void);

#endif

※制作流程:

第1步:编辑configure.in文件。

上面用autoscan生成的scan后缀的文件改名而成的configure.in文件,我的用autoconf版本是2.66,貌似autoscan自动生成的模板2.61之前与之后的不大一样,这点可以自己参照自己的版本修改,2.61以后的版本这个文件更简单了。

打开看看:

#                                               -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.66])

AC_INIT([family], [1.0], [804927399@qq.com])

AM_INIT_AUTOMAKE(family,1.0)

AC_CONFIG_SRCDIR([src/wife.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

src/Makefile])

AC_OUTPUT

configure.in 未修改版,简单对上面进行说明:

AC_PREREQ([2.66])这个宏是用来检测autoconf的版本的。

AC_INIT()是个初始化宏,括号中内容分别为:要生成的软件名称,版本号,bug报告邮箱

AM_INIT_AUTOMAKE(family,1.0)这个宏是新添加的,不过好像1.8的automake不用添加这个也可以,但是我没有添加的时候在后面make的时候会有“Makefile:15: *** 遗漏分隔符 。 停止。”的问题,而加上则有警告。现在还真有点晕呼呼滴。

AC_CONFIG_SRCDIR([src/wife.c])这个宏是用来检测源码目录的有效性,srcdir就可以看出来,括号里边的文件不一定非得是wife.c,也可以改成其他的。

AC_CONFIG_HEADERS([config.h])这个宏用来生成标准的config.h文件。

接下来的内容就是众多的check了

AC_PROG_CC这个是检测编译器的宏。

我们用的版本不用AC_OUTPUT输出了,还是比较省力的。

第2步:aclocal命令生成aclocal.m4文件

    不知为何,我直接用命令:

$aclocal 命令总是出错:aclocal

aclocal: couldn't open directory `/usr/local/share/aclocal-': 没有那个文件或目录。

最后还是加上绝对路径/usr/bin/aclocal总算是没这个错误,生成aclocal.m4了。

第3步:autoconf命令生成 configure文件

这一步没什么难度,输入命令:

$ autoconf 就ok了,autoconf可以根据configure.in和aclocal.m4生成大名鼎鼎的configure,这时候已经可以运行它了,但是会报错,因为Makefile.in还没出现。

那么何为M4呢,M4的名称取自Macro(M后面跟4个字母…)。它和C预处理器里的宏是一个概念(其实,M4和C预处理器都K&R操刀设计的!!),用来处理文本替换。也就是说,M4是bash里的预处理器。

第4步:autoheader命令生成config.h.in

    autoheader通过autoheader命令,我们就可以得到config.h.in这个东东了。有了它,./configure才会生成config.h这个东东,所以不可大意。

autoheader这个工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因此此处没有附加符号定义,所以不需要创建“acconfig.h”文件。

 

 

第5步:编辑Makefile.am文件

    我们再编译安装源码包的时候都知道./configure可以生成Makefile,殊不知要生成Makefile还全仰仗Makefile.in这个老东西,而这个东西是以in结尾的 ,也是个模板,是由Makefile.am生成的,好了,知道这个来龙去脉了,就着手编写Makefile.am,我们这里Family顶级目录与子目录各有一个,如果还有其他的子目录,理论上也是需要Makefile.am的。我们这就来编辑它:

    Family/Makefile.am内容如下:

AUTOMAKE_OPTIONS = foreign

SUBDIRS = src

 

 

Family/src/Makefile.am内容如下:

AUTOMAKE_OPTIONS = foreign

bin_PROGRAMS = family

family_SOURCES = main.c wife.c daughter.c wife.h daughter.h

其中的AUTOMAKE_OPTIONS为设置automake的选项。由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreign、gnu和gnits,让用 户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件,而不用检查README啊什么的。

bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。

family_SOURCES定义“family”这个执行程序所需要的原始文件。如果”family”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原 始文件都列出来,并用空格隔开。如果源文件名字太长,可以加上”/”行连接符换行书写。

 

第6步:automake --add-missing命令生成config.h.in

$ automake a或者 automake -add-missing,大功告成!

注意运行automake命令时一定要加参数,否则不会自动生成install.sh,missing等脚本,这样会出乱子滴。

这样,源码安装包就制作成了,用tar打包就可以了,使用的时候用三部曲./configure,make , make install安装即可帅吧!

转载于:https://my.oschina.net/ahuaahua/blog/28255

详解linux下auto工具制作Makefile源码包(制作篇)相关推荐

  1. linux应用程序逆向,Linux下查看并下载命令源码包(根据命令/应用程序逆向获取并且安装其所属源码包)...

    使用linux的过程中,我们会熟悉各种命令,偶尔我们不禁会问,这些命令是怎么实现的,学习他们其实是学习linux高级系统编程很快捷的方法. 这些命令的源码肯定是存放在相应的包里面,但是是哪些包呢? 发 ...

  2. linux上 arm开发环境搭建,详解 LINUX下QT For ARM开发环境搭建过程

    LINUX下QT For ARM开发环境搭建过程是本文介绍的内容,不多说,先来看内容.在PC上,我们需要得到两个版本的Qt,分别是:Qt-4.5.2和QtEmbedded-4.5.2-arm.前者包括 ...

  3. linux中which命令详解,Linux下which命令使用详解(转)

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. locate 配合数据库查看文件位置. f ...

  4. mysql5.5.8编译安装_Mysql应用linux下mysql 5.5.8 源码编译安装

    <MysqL应用linux下MysqL 5.5.8 源码编译安装>要点: 本文介绍了MysqL应用linux下MysqL 5.5.8 源码编译安装,希望对您有用.如果有疑问,可以联系我们. ...

  5. Linux下的软件安装方式+源码安装软件cmatrix代码雨

    Linux下的软件安装方式 1 rpm工具安装 2 yum工具安装 3 源码编译安装 软件包类型 1 二进制软件包(=rpm软件包) 无需编译,直接安装 根据计算机CPU架构类型和操作系统选择合适的软 ...

  6. java中batch基础_详解Spring batch 入门学习教程(附源码)

    详解Spring batch 入门学习教程(附源码) 发布时间:2020-09-08 00:28:40 来源:脚本之家 阅读:99 作者:achuo Spring batch 是一个开源的批处理框架. ...

  7. Android中mesure过程详解 (结合Android 4.0.4 最新源码)

    如何遍历并绘制View树?之前的文章Android中invalidate() 函数详解(结合Android 4.0.4 最新源码)中提到invalidate()最后会发起一个View树遍历的请求,并通 ...

  8. Android中layout过程详解 (结合Android 4.0.4 最新源码)

    上一篇文章Android中mesure过程详解 (结合Android 4.0.4 最新源码)介绍了View树的measure过程,相对与measure过程,本文介绍的layout过程要简单多了,正如l ...

  9. linux下 如何调试php,linux下使用gdb对php源码调试

    title: linux下使用gdb对php源码调试 date: 2018-02-11 17:59:08 tags: --- linux下使用gdb进行php调试 调试了一些php的漏洞,记录一下大概 ...

最新文章

  1. php代码 2012057
  2. ToolPart的简单开发
  3. Event-based Vision: A Survey——论文阅读笔记
  4. SpringBoot2.x开发案例之整合Quartz任务管理系统
  5. oracle 满足条件取第一行,sql – 如何只选择满足条件的第一行?
  6. EVC下如何直接访问寄存器?
  7. Sublime Text2使用教程(转载)
  8. Halcon视觉框架+车牌识别+汉字识别+颜色识别+20200930
  9. 网易公开课 mysql_“网易云课程”SQL分析
  10. 加勒比海盗海盗不雅镜头_土豆,海盗和……编程?
  11. SNAP 4. 使用snap进行地物光谱分析
  12. 【Linux学习笔记】last命令
  13. 荣耀magic3参数配置
  14. 为什么要使用kafka消息队列
  15. [ 华为云 ] 云计算中Region、VPC、AZ 是什么,他们又是什么关系,应该如何抉择
  16. CSS——高度塌陷以及解决方法
  17. 解决vc6卡死的办法就是打上官方的原版VC6sp6补丁|VS6sp6补丁
  18. 微信小程序实现表格展示
  19. Android发展趋势分析,droidcon北京2017安卓技术大会参会感悟
  20. HTAP数据库及应用场景简析

热门文章

  1. rpa操作excel_RPA的功能与技术剖析
  2. liunx tar安装mysql_在Linux下,安装Mysql(tar)
  3. c语言菱形花圃,一种便于自动修剪花圃的电锯支架的制作方法
  4. java-高并发解决方案
  5. mysql workbench kernelbase.dll_电脑出现kernelbase.dll错误的两种解决方法
  6. [k8s] 第七章 Service详解
  7. Maven:No goals have been specified for this build. You must specify a valid lifecycle phase
  8. iOS NSRunloop 详解
  9. 什么?分布式事务现在不是都在用么?你还不会?
  10. html省市联动插件,jquery实现的交互体验更友好省市区三级联动插件