9.其它派生对象
Automake还支持处理 C程序以外 的派生对象。
9.1 可执行脚本¶
完全可以定义和安装脚本类型的程序。使用_SCRIPTS
primary。
脚本默认是不发布的,可以使用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)";' >$@