写的问题
在您的 Makefile.am 中,您可以执行以下操作:
foo.c: foo.in
FOOPLACE=`./thescript`; $(FOOPLACE) -c -o $@ $<
这样做的好处是在可移植的 Makefile 代码中不需要 GNU 主义。
正确而艰难的道路
我准备了一个使用名为mkfoo
. 它可以使用内部副本或主机系统上的副本。
我们先来看看configure.ac
:
AC_PREREQ([2.67])
AC_INIT([parent], [0], [jack@jackkelly.name])
AM_INIT_AUTOMAKE([foreign])
AC_ARG_WITH([mkfoo],
[AS_HELP_STRING([--with-mkfoo],
[Path to mkfoo, "external", "internal", or "check" @<:@check@:>@])],
[MKFOO=$withval],
[with_mkfoo=check])
AS_IF([test "$with_mkfoo" = check -o "$with_mkfoo" = external],
[AC_PATH_PROG([MKFOO], [mkfoo], [no])])
AS_IF([test "$with_mkfoo" = external -a "$MKFOO" = no],
[AC_MSG_ERROR([External mkfoo demanded, but not found.])])
dnl We conditionally set MKFOO in Makefile.am
AM_SUBST_NOTMAKE([MKFOO])
AM_CONDITIONAL([USE_INTERNAL_MKFOO],
[test "$with_mkfoo" = internal -o "$MKFOO" = no])
AM_COND_IF([USE_INTERNAL_MKFOO], [AC_CONFIG_SUBDIRS([mkfoo])])
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT
这里发生了一些事情:
- 默认行为是“检查 mkfoo,如果不存在,则构建并使用捆绑的副本”。还要注意它支持
--with-mkfoo=PATH
(用户可能在一个奇怪的地方安装了一个副本),--with-mkfoo=internal
(distcheck 需要,我们想要测试所有东西)和--with-mkfoo=external
(对不喜欢捆绑子项目的包维护者的善意)。
AM_SUBST_NOTMAKE([MKFOO])
停止在中automake
生成一行表格MKFOO = @MKFOO@
。Makefile.in
我们需要有条件地完成这项任务。
- 我们设置了一个自动生成条件,因为我们需要为内部/外部
mkfoo
内部做不同的事情Makefile.am
- 我们
mkfoo
有条件地配置目录。
现在,顶层Makefile.am
:
if USE_INTERNAL_MKFOO
SUBDIRS = mkfoo
DIST_SUBDIRS = mkfoo
else
SUBDIRS =
DIST_SUBDIRS =
endif
SUBDIRS += src
DIST_SUBDIRS += src
## Need to make sure the internal tools work during distcheck.
DISTCHECK_CONFIGURE_FLAGS = --with-mkfoo=internal
dist-hook:
if ! USE_INTERNAL_MKFOO
cp -fpR $(srcdir)/mkfoo $(distdir)
endif
这里发生了什么:
- 有条件地递归到
mkfoo
,并在之前做src
,这需要$MKFOO
。
- 因为有次连配置
mkfoo
都没有,可能就没有了。这意味着我们已经坏了(并且通过扩展,)。所以我们也必须有条件地设置,如果我们没有配置,确保它的分布式成为我们的责任。Makefile
make dist
make distcheck
DIST_SUBDIRS
mkfoo
- 当我们
make distcheck
想要使用内部副本时,因为最好使用源 tarball 中的所有内容。
现在,src/Makefile.am
:
if USE_INTERNAL_MKFOO
MKFOO = $(abs_top_builddir)/mkfoo/mkfoo
else
MKFOO = @MKFOO@
endif
bin_SCRIPTS = foo
CLEANFILES = foo
EXTRA_DIST = foo.in
foo: foo.in
$(MKFOO) < $< > $@
除了 的条件赋值之外,这里没有什么令人震惊的MKFOO
。
src/foo.in
:
I am foo.in!
现在为子包。mkfoo/configure.ac
:
AC_PREREQ([2.67])
AC_INIT([mkfoo], [0], [jack@jackkelly.name])
AM_INIT_AUTOMAKE([foreign])
AC_PROG_CC
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
如您所见,没有什么特别的。怎么样mkfoo/Makefile.am
?
bin_PROGRAMS = mkfoo
mkfoo/mkfoo.c
:
#include <stdio.h>
int main(int argc, char *argv[]) {
puts("Internal mkfoo.");
return 0;
}
只是一个虚拟测试程序。