博客
关于我
编写Makefile.am
阅读量:351 次
发布时间:2019-03-04

本文共 2764 字,大约阅读时间需要 9 分钟。

一、Makefile.am

Makefile.am将指明工程需要哪些源文件,建造的是什么,如何安装它们。

1) 语法如下:

option_where_PRIMARY = targets …

option 可选项

描述
dist_ 分发目标(默认)
nodist_ 不分发

where 表示目标被安装那里,可以是下面的值:

可能项 解释
bin $(bindir)
lib $(libdir)
custom 自定义目录
noinst 不安装
check 由’make check’建造。

PRIMARY可以是下面的一个:

可能值 解释
PROGRAMS 目标是可执行程序
LIBRARIES 目标是静态库
LTLIBRARIES 目标是动态库
HEADERS 目标是头文件
SCRIPTS 目标是脚本
DATA 目标是数据

targets是要建造的目标

示列1:

bin_PROGRAMS = foo run-mefoo_SOURCES = foo.c foo.h print.c print.hrun_me_SOURCES = run.c run.h print.c

首先第一句表示产生两个程序foo,run-me,并且将它们安装到bin中。

foo_SOURCES 表示foo需要的源文件。
run_me_SOURCES 表示run-me需要的源文件。
注意:不能转换的符号用’_’代替。
头文件不参加编译,列出来用于分发。automake将自动计算列表对象并编译链接它们。

示列2:

lib_LIBRARIES = libfoo.a libbar.alibfoo_a_SOURCES = foo.c privfoo.hlibbar_a_SOURCES = bar.c privbar.hinclude_HEADERS = foo.h bar.h

这将产生两个静态库文件libfoo.a,libbar.a。

libfoo_a_SOURCES 表明编译libfoo.a需要的源文件。
libbar_a_SOURCES 表明编译libbar.a需要的源文件。
include_HEADERS 表明需要安装的头文件。

多Makefile.am文件:

也许你在几个目录里面编译,这些目录里面都放置的有Makefile.am文件。它们必须在configure.ac文件中声明。例如:configure.ac

AC_CONFIG_FILES([Makefile lib/Makefile src/Makefilesrc/dira/Makefile src/dirb/Makefile])

‘make’ 运行在根目录中。 使用SUBDIRS指定一个递归。

根Makefile.am文件:

SUBDIRS=lib src

src/Makefile.am

SUBDIRS = dira dirb

记住使用VPATH和$(srcdir)编译,源文件不需要在当前目录。

2)中间库

你可以使用noinst_LIBRARIES创建一个不安装的库,该库仅用在随后的链接中。如:lib/Makefile.am

noinst_LIBRARIES = libcompat.alibcompat_a_SOURCES = xalloc.c xalloc.h

另一个要编译的程序使用这个库。如:src/Makefile.am

src/Makele.amLDADD = ../lib/libcompat.aAM_CPPFLAGS = -I$(srcdir)/../libbin_PROGRAMS = foo run-mefoo_SOURCES = foo.c foo.h print.c print.hrun_me_SOURCES = run.c run.h print.c

LDADD在所有的链接时都附加该选项。

AM_CFFLAGS在所有的编译中使用附加的预处理选项

你可以给LDADD和CFFLAGS增加前缀,将它们限定在特定的编译和链接中。如:

run_me_LDADD = ../lib/libcompat.arun_me_CPPFLAGS = -I$(srcdir)/../lib

假设foo是一个程序或者库:

可能项 解释
foo_CFLAGS 为foo附加编译选项
foo_CPPFLAGS 为foo附加预处理选项(-Is and -Ds)
foo_LDADD 为foo链接附加库,-ls 和 -Ls (foo必须是一个程序)
foo_LIBADD 为foo链接附加库,-ls 和 -Ls (foo必须是一个库)
foo_LDFLAGS 为foo链接选项

通过使用AC_CHECK_LIB可以判断库是否存在,并在这里附加它们。

例如:configure.ac

AC_CHECK_LIB([efence], [malloc], [EFENCELIB=-lefence])AC_SUBST([EFENCELIB])
run_me_LDADD = ../lib/libcompat.a $(EFENCELIB)

3)分发

‘make dist’和’make distacheck’将创建一个tarball包含下面列出的文件。

所有在_SOURCES中声明的。
所有在_HEADERS中声明的。
所有的在dist_…SCRIPTS中声明的脚本。
所有在dist
…_DATA中声明的数据文件。
公共文件例如ChangeLog,NEWS,等。使用automake –help可以列出这些文件。
所有在EXTRA_DIST中列出的路径和文件。

4)条件编译

可以根据某些条件来编译附加的程序或者关闭。例如:Makefile.am

bin_PROGRAMS = fooif WANT_BARbin_PROGRAMS += barendiffoo_SOURCES = foo.cbar_SOURCES = bar.c

如果WANT_BAR被设置为true将编译程序bar。

在所有的情况下都会分发foo.c和bar.c。

bin_PROGRAMS = foofoo_SOURCES = foo.cif WANT_BARfoo_SOURCES += bar.cendif

上面代码显示,根据WANT_BAR打开bar.c的分发。

上面的代码的前提是必须在configure.ac中声明WANT_BAR变量。
可以使用AM_CONDITIONAL宏。参考编写configure.ac

AC_CHECK_HEADER([bar.h], [use_bar=yes])AM_CONDITIONAL([WANT_BAR], [test "$use_bar" = yes])

转载地址:http://zuhr.baihongyu.com/

你可能感兴趣的文章
Vue使用bus进行组件间、父子路由间通信
查看>>
数据库三个级别封锁协议
查看>>
计算机网络学习笔记:数据链路层&局域网
查看>>
操作系统:文件的分类
查看>>
操作系统:缓冲技术的相关介绍
查看>>
函数与指针分析、回调函数
查看>>
新型类型转换
查看>>
类的实例
查看>>
写一个宏,计算结构体中某变量相对于首地址的偏移和写一个宏,可以将一个整数字的奇数位和偶数位交换
查看>>
Java中数据类型和运算符
查看>>
PAT 锤子剪刀布
查看>>
tomcat加载部署webapps目录下的项目
查看>>
JVM系统整理
查看>>
JAVA面经
查看>>
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
查看>>
super关键字与this关键字区别
查看>>
方法重写
查看>>
搜索指定视图上的TextField,从而取消其第一响应者
查看>>
Threading Programming Guide(多线程编程指南)
查看>>
Expected selector for Objective-C and Expected method body
查看>>