summaryrefslogtreecommitdiffstats
path: root/patches/02_fix-preconfigure-on-busybox-ash.patch
blob: 16ef4e4a5c0473200e4a2c34ed25436a80de77ff (plain)
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
 }