Makefile文件生成

(2008-04-28 19:19:01)

转载
标签:

linux

分类:DoxygenMakefile

所必须的软件:autoconf(generate configuration script [configuration])
automake(  aclocal:automatically generateaclocal.m4 from configure.in)
m4      perl        libtool(其中libtool非必须)。

autoconf是一个用于生成可以自动地配置软件源码包,用以适应多种UNIX类系统的shell脚本工具,其中autoconf需要用到m4,便于生成脚本。automake是一个从Makefile.am文件自动生成Makefile.in的工具。为了生成Makefile.in,automake还需用到perl,由于automake创建的发布完全遵循GNU标准,所以在创建中不需要perl。libtool是一款方便生成各种程序库的工具。

生成Makefile的操作过程如下:

1) 运行autoscan命令

2) 将configure.scan 文件重命名为configure.in,并修改configure.in文件

 $sudo mv configure.scan configure.in

3)在project目录下新建Makefile.am文件,并在core和shell目录下也新建makefile.am文件

4) 在project目录下新建NEWS、 README、 ChangeLog 、AUTHORS文件

5) 将/usr/share/automake-1.10/目录下的depcomp和complie文件拷贝到本目录下

6) 运行aclocal命令(configure.in-->aclocal.m4)

7) 运行autoconf命令 (configure.in+aclocal.m4 -->configuration)

8) 运行automake -a命令(Makefile.am+configuration.in-->Makefile.in)

9) 运行./confiugre脚本

生成Makefile流程图

从上图中可以看出,对于用户而言,其中最主要的就是编写configuratio.in和Makefile.am文件,首先我们来看configuration.in文件 ,每个configure.scan文件都是以AC_INIT开头,以AC_OUTPUT结束。我们不难从文件中看出confiugre.in文件的一般布局为: 测试程序(checkfor programs),测试库(libraries),测试头文件(headerfile),测试类型定义(typedef),测试结构(constructure),测试编译器特性(compilercharacters),测试库函数(libraries functions);修改后的结果如下:

               #                                -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ(2.61)#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)AC_INIT(test, 1.0, haizi007418@sina.com)AC_CONFIG_SRCDIR([src/ModuleA/apple/core/test.c])AM_CONFIG_HEADER(config.h)# AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)AM_INIT_AUTOMAKE(test,1.0)# Checks for programs.AC_PROG_CC# Checks for libraries.# FIXME: Replace `main' with a function in `-lpthread':AC_CHECK_LIB([pthread], [pthread_rwlock_init])AC_PROG_RANLIB #Multithread# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.# 在AC_OUTPUT输入 要创建的Makefile文件名AC_OUTPUT([Makefilesrc/lib/Makefilesrc/ModuleA/apple/core/Makefilesrc/ModuleA/apple/shell/Makefile])

其中要将AC_CONFIG_HEADER([config.h])修改为:AM_CONFIG_HEADER(config.h),并加入AM_INIT_AUTOMAKE(test,1.0);

 

最后,我们来看看Makefile.am文件,它是一种比Makefile更高层次的规则。 只需指定要生成什么目标,它由什么源文件生成,要安装到什么目录等构成。表一列出了可执行文件、静态库、头文件和数据文件,四种书写Makefile.am文件个一般格式。
表 1Makefile.am一般格式

对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。

表 2Makefile.am中可用的全局变量

在Makefile.am中尽量使用相对路径,系统预定义了两个基本路径:

表3Makefile.am中可用的路径变量

在上文中我们提到过安装路径,automake设置了默认的安装路径:

1) 标准安装路径

默认安装路径为:$(prefix) = /usr/local,可以通过./configure--prefix=<new_path>的方法来覆盖。

其它的预定义目录还包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib,datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。

2) 定义一个新的安装路径

比如test, 可定义testdir = $(prefix)/test, 然后test_DATA =test1test2,则test1,test2会作为数据文件安装到$(prefix)/ /test目录下。

我们首先需要在工程顶层目录下创建一个Makefile.am来指明包含的子目录,由于每个源文件都会用到相同的头文件,所以我们在最顶层的Makefile.am中包含了编译源文件时所用到的头文件,并导出。

SUBDIRS=src/lib src/ModuleA/apple/shell src/ModuleA/apple/core CURRENTPATH=$(shell /bin/pwd)INCLUDES=-I$(CURRENTPATH)/src/include -I$(CURRENTPATH)/src/ModuleA/apple/include export INCLUDES

我们将lib目录下的swap.c文件编译成libswap.a文件(只想编译,而并不想安装), 被apple/shell/apple.c文件调用,那么lib目录下的Makefile.am如下所示:

noinst_LIBRARIES=libswap.alibswap_a_SOURCES=swap.cINCLUDES=-I$(top_srcdir)/src/includ

如果想安装,那么库将会安装到$(prefix)/lib目录下,可执行文件将会安装到${prefix}/bin,则Makefile.am如下:

bin_LIBRARIES=libswap.alibswap_a_SOURCES=swap.cINCLUDES=-I$(top_srcdir)/src/include# 将swap.h安装到${prefix}/include /swap目录下swapincludedir=$(includedir)/swapswapinclude_HEADERS=$(top_srcdir)/src/include/swap.h

接下来,对于可执行文件类型的情况,我们将讨论如何写Makefile.am?对于编译apple/core目录下的文件,我们写成的Makefile.am如下所示:

noinst_PROGRAMS=testtest_SOURCES=test.c # test.c文件在链接时,需要apple.o和
libswap.a文件test_LDADD=$(top_srcdir)/src/ModuleA/apple/shell/apple.o $(top_srcdir)/src/lib/libswap.a # Linux下的信号量/读写锁文件进行编译,需要在编译选项中指明-
D_GNU_SOURCEtest_LDFLAGS=-D_GNU_SOURCE# test_LDFLAGS只是链接时的选项,编译时同样需要指明该选项,所以需要
DEFS来指明编译选项# DEFS已经有初始值,所以这里用+=的形式指明。DEFS+=-D_GNU_SOURCE# 如果你的程序还包含其他的库,除了用AC_CHECK_LIB宏来指明外,还可以用LIBS来指明#LIBS=-lpthread

终结:

对于一个已有configure.in and Makefile.am的源程序包,我们只需要通过执行下述命令来生成Makefile文件: aclocal ,autoconf,automake,./configure 就可以生成Makefile文件,然后sudo make就开始编译源程序(编译时error),最后sudo  make install安装。运行。。。。。。(可能有运行时error)!

Makefile文件生成相关推荐

  1. linux makefile文件怎么生成,Makefile文件生成

    所必须的软件:autoconf (generate configuration script [configuration]) automake( aclocal:automatically gene ...

  2. 多文件目录下makefile文件递归执行编译所有c文件 很不错

    下面是网上找到的,思路很不错,当然也无法满足所有的需求,我执行又修改了一套.解决了下面的方法存在的问题:每次编译都是全编译的问题,解决思路是.o文件需要跟编译的makefile文件同目录. 首先说说本 ...

  3. 例解 autoconf 和 automake 生成 Makefile 文件

    http://www.ibm.com/developerworks/cn/linux/l-makefile/ 生成 Makefile 的来龙去脉 首先进入 project 目录,在该目录下运行一系列命 ...

  4. 生成简单的Makefile文件(Python实现)

    在linux下写几个测试程序,还要一行行的输入g++命令进行编译,当经常改测试代码的时候,那一次次的敲(或者一次次的上线箭头选)也感觉不爽,不如make来的快.用Makefile的好处就不用多说了,这 ...

  5. Ubuntu下使用cmake结合CmakeLists.txt生成makefile文件并进行编译

    转自1:https://www.cnblogs.com/cv-pr/p/6206921.html 转自2:https://blog.csdn.net/qqwangfan/article/details ...

  6. 例解 autoconf 和 automake 生成 Makefile 文件[转+个人修改]

    引子 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或 make install.利用make工具,我们可 ...

  7. Makefile文件自动生成,ubuntu系统autotools使用

    多目录项目用automake和autoconf自动生成Makefile方法 在Linux系统下编写代码,基本上都会遇到Makefile的使用,虽说它对于工程管理有很方便的作用,但对初学者来说要编写出自 ...

  8. SlickEdit生成.a或.so后缀的makefile文件

    1)打开SlickEdit软件,菜单栏选择"Project"选项,然后选择"New...",如下图 2)弹出窗口进行如下设置,完成之后点击OK,如果文件夹不存在 ...

  9. Ubuntu ./configure 半途终止 导致没有生成makefile文件 解决方法

    在安装thrift的时候,解压包进入目录,执行命令: ./configure 之后,发现某些包没有安装,导致configure到一半的时候退出,接着make发现没有makefile文件.估计是我系统安 ...

最新文章

  1. property、staticmethod、classmethod与__str__的用法
  2. boost::hana::take_front_c用法的测试程序
  3. OpenCV添加(混合)两个图像
  4. datasnap——动态注册服务类
  5. java声明一个函数_java – 如何声明一个函数参数来接受抛出的函数?
  6. Spring Boot动态修改日志级别
  7. mysql asp 字段部分内容_sql 修改、更新、替换 某个字段的部分内容(转载)
  8. 20200806:Java拓扑排序实现力扣210课程表Ⅱ
  9. python 黑客工具开发_python黑客软件的搜索结果-阿里云开发者社区
  10. C++获取当前时间及计算当前时间距某个时间点的时间段
  11. LncRNADisease:IncRNA相关疾病数据库简介
  12. Cocos Creator 自制小工具-小游戏场景地图编辑器
  13. 数据库常见导入文件方法
  14. 如何用Ps制作中国移动基础框架
  15. [RedHat] RHCE_RHEL6_实战精品 6.postfix邮件服务器
  16. 论K21O Draco开发板的概论
  17. 详细讲解Java整数类型
  18. chrome浏览器删除一些自动出现的书签
  19. 通达信股票支撑点选股公式主图/副图 无未来
  20. [原创]TenJi Game-线下玩法技巧

热门文章

  1. Laravel 的数据库迁移
  2. macbook双网卡路由
  3. 【资源】C++学习资料 - 逆天整理 - 精华无密版【最新】
  4. linux软件包管理之rpm 、yum基本使用
  5. Linux基础书籍推荐
  6. 字体中字号,磅值和mm之间的转换
  7. Windows Forms DataGridView 中合并单元格
  8. poj 1190(剪枝)
  9. Arrays(Chapter 6 of JavaScript: The Good Parts)
  10. 做中间件的这两年总结(201704-201905)