9.其它派生对象

本系列文章均翻译自Automake官方文档:Automake Manual,github同步项目:question

Automake还支持处理 C程序以外 的派生对象。

9.1 可执行脚本

完全可以定义和安装脚本类型的程序。使用_SCRIPTSprimary。
脚本默认是不发布的,可以使用dist_来改变。

# Install my_script in $(bindir) and distribute it.
dist_bin_SCRIPTS = my_script

脚本可以安装到bindir, sbindir, libexecdir, pkglibexecdir, pkgdatadir

无需安装的脚本列在noinst_SCRIPTS,在他们中,只被make check需要的列在check_SCRIPTS

9.2 头文件

必须被安装的头文件通过_HEADERS变量实现。可以被安装到includedir, oldincludedir, pkgincludedir或者任何自定义的目录。例如:

include_HEADERS = foo.h bar/bar.h

将安装两个文件 $(includedir)/foo.h and $(includedir)/bar.h。

所有的头文件必须被列在_SOURCES_HEADERS中。

一定不能发布的头文件写在nodist_include_HEADERS or nodist_prog_SOURCES中。

9.3 架构无关数据文件

Automake支持杂数据文件的安装,使用_DATA变量。

可以被安装到的文件夹:datadir, sysconfdir, sharedstatedir, localstatedir, or pkgdatadir

dist_pkgdata_DATA = clean-kr.am clean.am …

9.4 构建源文件

自动依赖追踪依赖于编译,所以只有在第一次编译的时候才能知道其依赖关系。

存在的问题:如果需要构建可执行程序foo,但是却没有foo.h,比如foo.h是其它规则的对象并且该规则没有执行,那么会构建失败。

为了解决这一问题,可使用BUILT_SOURCES变量。在该变量中列出的源文件是在make all or make check (or even make install)时在其他目标被执行之前创建的。

1.使用 BUILT_SOURCES

所以,可以使用BUILT_SOURCES = foo.h来确保make all or make check的时候,该文件在其他目标之前被构建。

2.手动编写依赖

如果你在上述三个make命令之前执行了其他的 make foo 命令,那么会报错。???不会报错啊

解决这个问题的替代BUILT_SOURCES的写法是

foo.$(OBJEXT): bindir.h

3.从 configure 构建 头文件

可以在config.h中定义头文件的宏(see Defining Directories),或者使用AC_CONFIG_FILES(see Configuration Actions)驱动 bindir.h.in 文件。

如此一来,Makefile.am就能写地很简短:

bin_PROGRAMS = foo
foo_SOURCES = foo.c

但是总会有不能从configure构建源文件的情况。

4.构建 .c 文件,而不是 .h 文件

noinst_PROGRAMS = foo
foo_SOURCES = foo.c bindir.h
nodist_foo_SOURCES = bindir.c
CLEANFILES = bindir.c
bindir.c: Makefile
        echo 'const char bindir[] = "$(bindir)";' >$@

猜你喜欢

转载自blog.csdn.net/SHRINKSHR/article/details/85838677