書面
在你的Makefile.am的問題,你可以做這樣的事情:
foo.c: foo.in
FOOPLACE=`./thescript`; $(FOOPLACE) -c -o [email protected] $<
還沒有要求什麼是指GNU主義的好處是可移植的Makefile代碼。
正確的和硬的方式
我已經準備使用一種稱爲mkfoo
工具傻瓜包。它可以使用主機系統上的內部副本或副本。
讓我們先來看看configure.ac
:
AC_PREREQ([2.67])
AC_INIT([parent], [0], [[email protected]])
AM_INIT_AUTOMAKE([foreign])
AC_ARG_WITH([mkfoo],
[AS_HELP_STRING([--with-mkfoo],
[Path to mkfoo, "external", "internal", or "check" @<:@[email protected]:>@])],
[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
從Makefile.in
生成MKFOO = @[email protected]
表格的一行。我們需要有條件地完成這項任務。
- 我們設置條件的automake的,因爲我們需要爲內部/外部
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
要使用的內部複製,因爲它是更好地行使在源碼包中的一切。
現在,src/Makefile.am
:
if USE_INTERNAL_MKFOO
MKFOO = $(abs_top_builddir)/mkfoo/mkfoo
else
MKFOO = @[email protected]
endif
bin_SCRIPTS = foo
CLEANFILES = foo
EXTRA_DIST = foo.in
foo: foo.in
$(MKFOO) < $< > [email protected]
沒有什麼令人震驚的除了這裏的MKFOO
有條件分配。
src/foo.in
:
I am foo.in!
現在的分裝。 mkfoo/configure.ac
:
AC_PREREQ([2.67])
AC_INIT([mkfoo], [0], [[email protected]])
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;
}
只是一個虛擬的測試程序。
make變量'$(abs_top_builddir)'有什麼問題? – 2013-02-28 13:33:48
@WilliamPursell,我會編輯這個問題來解釋這一點。 – crobar 2013-02-28 13:45:05
@WilliamPursell,我現在編輯過,如果你有一個想法,我會接受完全不同的解決方案。我是新來的。 – crobar 2013-02-28 13:52:50