1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
From: "P. J. McDermott" <pjm@nac.net>
Description: Fix sysdeps preconfigure fragments on BusyBox ash
On shells that don't support the LINENO parameter (e.g. BusyBox ash), the
AS_LINENO_PREPARE macro (executed by AC_INIT) preprocesses the script
$as_myself into $as_me.lineno.
.
Unfortunately, when loading (with the "." utility) sysdeps preconfigure
fragements, these as_* parameters refer to the configure script rather than
the fragments.
.
As a result, the configure script is in turn loaded by a preconfigure fragment
in an infinitely recursive loop.
.
$as_myself and (especially) $as_me need to be changed to refer to the fragment
to make it stop loading the configure script.
.
$as_myself can simply be set in configure to the path to the fragment. (Of
course, it should be changed back to the path to configure after the fragment
is loaded.)
.
However, changing $as_me from configure doesn't help; AS_LINENO_PREPARE in the
fragment just clobbers the change and reverts $as_me back to "configure" (the
script name it gets from $0). So the fragment will end up writing itself over
the configure script! We need to change the value of $as_me some other way.
.
So we create a new directory in the build area and load the fragment from
there. With this trick, $as_me refers to a file named configure in a
subdirectory of the build area. It's not perfect, but it's minimally invasive
(touching only a glibc M4 macro and no Autoconf macros).
.
The fragment needs to find confdefs.h, so we also link or copy this file into
the new directory.
.
But AS_LINENO_PREPARE causes the fragment to exit after reloading itself (to
prevent the whole script from running twice). So we change "exit" to "return"
in AS_LINENO_PREPARE in the fragment to tell the shell to stop executing the
loaded script.
.
In summary, this patch temporarily changes $as_myself to refer to the
fragments, enters a new directory in the build area (since the preconfigure
fragment will write a modified copy of itself to configure.lineno in its
current working directory), makes a copy of confdefs.h in the new directory,
and prevents fragments from killing the entire configure script. All this
allows the fragments to be properly preprocessed and the loop to be broken.
diff -Naur src.orig/libc/aclocal.m4 src/libc/aclocal.m4
--- src.orig/libc/aclocal.m4 2012-12-02 16:11:45.000000000 -0500
+++ src/libc/aclocal.m4 2013-06-20 12:19:51.818414209 -0400
@@ -161,7 +161,17 @@
for frag in $frags; do
name=`echo "$frag" | sed 's@/[[^/]]*[$]@@;s@^.*/@@'`
echo $ECHO_N "$name $ECHO_C" >&AS_MESSAGE_FD
+ orig_as_myself=$as_myself
+ as_myself=$frag
+ as_dir=sysdeps/${frag##*/sysdeps/}
+ as_dir=${as_dir%/preconfigure}
+ as_fn_mkdir_p
+ rm -f $ac_pwd/$as_dir/confdefs.h
+ $as_ln_s $ac_pwd/confdefs.h $ac_pwd/$as_dir/confdefs.h
+ cd $as_dir
. "$frag"
+ cd $ac_pwd
+ as_myself=$orig_as_myself
done
AC_MSG_RESULT()
fi])
diff -Naur src.orig/libc/configure src/libc/configure
--- src.orig/libc/configure 2012-12-02 16:11:45.000000000 -0500
+++ src/libc/configure 2013-06-20 12:24:26.226678382 -0400
@@ -4000,7 +4000,17 @@
for frag in $frags; do
name=`echo "$frag" | sed 's@/[^/]*$@@;s@^.*/@@'`
echo $ECHO_N "$name $ECHO_C" >&6
+ orig_as_myself=$as_myself
+ as_myself=$frag
+ as_dir=sysdeps/${frag##*/sysdeps/}
+ as_dir=${as_dir%/preconfigure}
+ as_fn_mkdir_p
+ rm -f $ac_pwd/$as_dir/confdefs.h
+ $as_ln_s $ac_pwd/confdefs.h $ac_pwd/$as_dir/confdefs.h
+ cd $as_dir
. "$frag"
+ cd $ac_pwd
+ as_myself=$orig_as_myself
done
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
$as_echo "" >&6; }
diff -Naur src.orig/libc/sysdeps/x86_64/preconfigure src/libc/sysdeps/x86_64/preconfigure
--- src.orig/libc/sysdeps/x86_64/preconfigure 2012-04-21 13:19:39.000000000 -0400
+++ src/libc/sysdeps/x86_64/preconfigure 2013-06-20 17:23:38.340955965 -0400
@@ -77,7 +77,7 @@
# original and so on. Autoconf is especially sensitive to this).
. "./$as_me.lineno"
# Exit status is that of the last command.
- exit
+ return
}
|