summaryrefslogtreecommitdiffstats
path: root/patches/02_fix-preconfigure-on-busybox-ash.patch
blob: 7bc8edc1543b55ddb7cd5d53006187cc86990bf0 (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
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.
 .
 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), and makes a copy of confdefs.h in the new
 directory.  All this allows the fragments to be properly preprocessed and
 breaking the loop.

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; }