Chinaunix首页 | 论坛 | 博客
  • 博客访问: 299812
  • 博文数量: 70
  • 博客积分: 1990
  • 博客等级: 上尉
  • 技术积分: 686
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-02 08:52
文章分类

全部博文(70)

文章存档

2015年(2)

2014年(9)

2013年(2)

2012年(20)

2011年(1)

2010年(36)

分类:

2012-01-18 19:19:48

原文地址:Makefile 作者:yulinlin12345

一、makefile
1. 适用范围
适用于项目改动频繁和大型项目

2.makefile规则
target ... : prerequisites ...
command
...
...
target可以是目标文件/Object File/执行文件/标签(Label).PHONE
prerequisites是生成target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
        贯穿于整个规则的是"依赖关系":
        target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。
        (make的时候,会将target与prerequisites的时间进行比较,target不存在或者时间比之旧,就执行其下的command)
        即prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。

3.
直接输入make, 只执行第一个Target

4.
make变量语法:
变量与变量内容以『=』隔开,同时两边可以具有空格;
变量左边不可以有
变量与变量内容在『=』两边不能具有『:』;
在习惯上,变数最好是以『大写字母』为主;
运用变量时,以 ${变量} 或 $(变量) 使用;
在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变数!
在指令列模式也可以给予变量。


二、automake
1.
automake编写makefile的好处.
1).兼容性好.
2).用户通过./configure, make, make install可以配置程序环境,编译程序, 并将程序的可执行目标文件拷贝到/usr/local/bin

2.
automake需要的工具:
autoconf automake m4 perl libtool

3.
automake支持的3种目录层次结构
分别是flat、shallow和deep。
1).flat指的是所有文件都位于同一个目录中(仅需要1到2个Makefile.am)
所有源文件、头文件以及其他库文件都位于当前目录中,且没有子目录。Termutils就是这一类。
2).shallow指的是主要的源代码都储存在顶层目录,其他各个部分则储存在子目录中。
主要源文件在当前目录中,而其它一些实现各部分功能的源文件位于各自不同的目录。automake本身就是这一类。
3).deep指的是所有源代码都被储存在子目录中;顶层目录主要包含配置信息。
所有源文件及自己写的头文件位于当前目录的一个子目录中,而当前目录里没有任何源文件. GNU cpio和GNU tar就是这一类

4.
生成Makefile步骤
1).autoscan 将生成的configure.scan重命名为configure.in或者configure.ac,并进行编辑.
2).aclocal
3).autoconf
4).autoheader
5).根据在configure.in(/ac)指定需要生成的Makefile文件个数,建立对应的Makefile.am,并进行编译.
6).automake --add-missing --copy
7).touch NEWS README ChangeLog AUTHORS
8)../configure
9).make
10).make install 拷贝可执行程序到/usr/local/bin,需要root 特权.

5.
编辑configure.in文件
-----------------------------------------------------------------------
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)        #AC_INIT的参数要换成实际的参数
AC_CONFIG_SRCDIR([src/*.c])                    #main function 所在文件
AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE                        #增加automake的初始化宏

# Checks for programs.
AC_PROG_CC
AC_PROG_RANLIB                            #多线程支持

AC_LIBTOOL_DLOPEN
AC_PROG_LIBTOOL                            #添加libtool检查

# Checks for libraries.
# FIXME: Replace `pthread_mutex_init' with a function in `-lpthread':    #添加静态库
AC_CHECK_LIB([pthread], [pthread_mutex_init])                #指定表态库的一个函数查询库是否正常

# Checks for header files.
AC_CHECK_HEADERS([stdlib.h string.h unistd.h])                #添加头文件

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
AC_FUNC_MALLOC
AC_CHECK_FUNCS([memset strchr strdup strtoul])

AC_CONFIG_FILES([Makefile])

AC_OUTPUT                #AC_OUTPUT中或者AC_CONFIG_FILES要指明实际要生成的文件
------------------------------------------------------------------------

6.
编辑Makefile.am文件
在configure.in中指定哪些地方生成Makefile,需要在指定的地方创建Makefile.am,并进行编辑
Makefile.am可使用的全局变量
INCLUDES    #链接时所需的头文件
LDADD        #链接时所需的库文件
LDFLAGS        #链接时所需的库文件的选项标志
SUBDIRS        #在处理本目录之前,需递归哪些子目录

Makefile的一般格式
1.可执行文件
bin_PROGRAMS=foo
foo_SOURCES=***.c
foo_LDADD=***
foo_LDFLAGS=***
foo_DEPENDENCIES=***
2.库文件
lib_LIBRARIES=libfoo.a
foo_a_SOURCES=***.c
foo_a_LDADD=***
foo_a_LIBADD=***
foo_a_LDFLAGS=***

Makefile可使用的路径变量
$(top_srcdir)    #工程最顶目录,用于引用源程序
$(top_builddir) #定义了生成目录文件的最上层目录,用于引用.o编译出来的目标文件
阅读(870) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~