makefile.am_make与makefile的区别_makefile编写

Makefile.am用于指定工程的源文件、目标及安装路径,它是Automake工具的输入。主要内容包括定义程序、库的源文件,安装位置以及编译选项。例如,foo_SOURCES表示foo程序的源文件,libfoo_a_SOURCES表示libfoo.a库的源文件。可以通过noinst_前缀创建不安装的库或程序。Automake会自动生成Makefile.in,配置过程中可通过AM_CONDITIONAL宏实现条件编译。在编写时,建议使用相对路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

具体语法如下:

option_where_PRIMARY = targets …

targets是要建造的目标

PRIMARY可以是下面的一个:

可能值 解释

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

可能项 解释

详细的文件结构看以前的文章。

[Autotools 使用一,文件结构]

()

在where前面还可以有一个可选项option

dist_ 分发目标(默认)。

nodist_ 不分发。

举例:Makefile.am

 

bin_PROGRAMS = foo run-me
foo_SOURCES = foo.c foo.h print.c print.h
run_me_SOURCES = run.c run.h print.c

 

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

foo_SOURCES 表示foo需要的源文件。

run_me_SOURCES 表示run-me需要的源文件。

注意:不能转换的符号用’_’代替。

头文件不参加编译,列出来用于分发。automake将自动计算列表对象并编译链接它们。

第二个例子:Makefile.am

 

lib_LIBRARIES = libfoo.a libbar.a
libfoo_a_SOURCES = foo.c privfoo.h
libbar_a_SOURCES = bar.c privbar.h
include_HEADERS = foo.h bar.h

 

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

libfoo_a_SOURCES 表明编译libfoo.a需要的源文件。

libbar_a_SOURCES 表明编译libbar.a需要的源文件。

include_HEADERS 表明需要安装的头文件。

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

 

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

 

‘make’ 运行在根目录中。

使用SUBDIRS指定一个递归。

Makefile.am

 

SUBDIRS=lib src

 

src/Makefile.am

 

SUBDIRS = dira dirb

 

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

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

 

noinst_LIBRARIES = libcompat.a
libcompat_a_SOURCES = xalloc.c xalloc.h

 

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

 

src/Makele.am
LDADD = ../lib/libcompat.a
AM_CPPFLAGS = -I$(srcdir)/../lib
bin_PROGRAMS = foo run-me
foo_SOURCES = foo.c foo.h print.c print.h
run_me_SOURCES = run.c run.h print.c

 

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

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

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

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

 

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

可能项 解释

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

例如:configure.ac

 

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

 

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

所有在_SOURCES中声明的。

所有在_HEADERS中声明的。

所有的在dist_…_SCRIPTS中声明的脚本。makefile.am

所有在dist_…_DATA中声明的数据文件。

公共文件例如ChangeLog,NEWS,等。使用automake –help可以列出这些文件。

所有在EXTRA_DIST中列出的路径和文件。makefile.am

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

 

bin_PROGRAMS = foo
if WANT_BAR
bin_PROGRAMS += bar
endif
foo_SOURCES = foo.c
bar_SOURCES = bar.c

 

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

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

 

bin_PROGRAMS = foo
foo_SOURCES = foo.c
if WANT_BAR
foo_SOURCES += bar.c
endif

 

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

上面的代码的前提是必须在configure.ac中声明WANT_BAR变量。

可以使用AM_CONDITIONAL宏。参考

 

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

 

Makefile.am的内容几乎被完整的复制到Makefile.in文件里。

‘automake’在Makefile.in附加新的规则和变量,你能实现特别的变量和宏。

你是可以在Makefile.am中定义你自己的规则

如果你make失败,试着重新建造configure文件。你可以运行autoreconf。

 

autoreconf --install

 

如果没有帮助,可以试试

基本格式

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

可用全局变量
    
    这些全局变量,上面的所有编译项里面都可以用。

基本相对路径
    
    在编写Makefile.am文件时,尽可能的用相对路径,要不在不同的地方编译,安装可能是到不同的目录了,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值