一、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编译出来的目标文件
阅读(1338) | 评论(0) | 转发(0) |