1From 08617a8d29ee22831175697555558fec8f52772c Mon Sep 17 00:00:00 2001
2From: Samuel Martin <s.martin49@gmail.com>
3Date: Sun, 1 Jun 2014 16:05:04 +0200
4Subject: [PATCH] auto/unix: make sys_nerr guessing cross-friendly
5
6This patch replaces the default sys_nerr runtest with a test done at
7buildtime.
8
9The idea behind this buildtime test is finding the value of the ERR_MAX
10macro if defined, or the EHWPOISON (which is currently the last errno)
11otherwise.
12
13Signed-off-by: Samuel Martin <s.martin49@gmail.com>
14
15Refresh for 1.8.0.
16
17Signed-off-by: Danomi Manchego <danomimanchego123@gmail.com>
18[rebased against v1.20.1]
19Signed-off-by: Adam Duskett <Aduskett@gmail.com>
20---
21 auto/os/sys_nerr | 78 ++++++++++++++++++++++++++++++++++++++++++++++++
22 auto/unix        |  8 +++++
23 2 files changed, 86 insertions(+)
24 create mode 100644 auto/os/sys_nerr
25
26diff --git a/auto/os/sys_nerr b/auto/os/sys_nerr
27new file mode 100644
28index 0000000..8970f5f
29--- /dev/null
30+++ b/auto/os/sys_nerr
31@@ -0,0 +1,78 @@
32+
33+# Copyright (C) Samuel Martin <s.martin49@gmail.com>
34+
35+
36+echo $ngx_n "checking for sys_nerr value...$ngx_c"
37+
38+# sys_nerr guessing is done using a (very) poor (but working)
39+# heuristics, by checking for the value of ERR_MAX if defined, or
40+# EHWPOISON otherwise.
41+
42+cat << END >> $NGX_AUTOCONF_ERR
43+
44+----------------------------------------
45+checking for sys_nerr value
46+
47+END
48+
49+ngx_sys_nerr=
50+
51+cat << _EOF > $NGX_AUTOTEST.c
52+
53+#include <stdio.h>
54+#include <errno.h>
55+
56+static char sys_nerr_test[ERR_MAX];
57+int main(void)
58+{
59+    return 0;
60+}
61+
62+_EOF
63+
64+if $CC $CC_TEST_FLAGS $CC_AUX_FLAGS \
65+        $NGX_AUTOTEST.c -o $NGX_AUTOTEST \
66+        $NGX_LD_OPT $ngx_feature_libs >/dev/null 2>&1 ; then
67+    _ngx_max_err_macro=ERR_MAX
68+else
69+    # the +2 has been empirically found!
70+    _ngx_max_err_macro="EHWPOISON + 2"
71+fi
72+
73+cat << _EOF > $NGX_AUTOTEST.c
74+
75+#include <stdio.h>
76+#include <errno.h>
77+
78+static char sys_nerr_test[(TEST_ERR_MAX == $_ngx_max_err_macro) ? 1 : -1];
79+int main(void)
80+{
81+    return 0;
82+}
83+
84+_EOF
85+
86+
87+ngx_sys_nerr=`for i in $(seq 0 2000) ; do \
88+    $CC $CC_TEST_FLAGS $CC_AUX_FLAGS \
89+    -DTEST_ERR_MAX="$i" \
90+    $NGX_AUTOTEST.c -o $NGX_AUTOTEST \
91+    $NGX_LD_OPT $ngx_feature_libs >/dev/null 2>&1 || continue ;\
92+    echo $i ; break ; done`
93+
94+rm -rf $NGX_AUTOTEST*
95+
96+if test -z $ngx_sys_nerr ; then
97+    ngx_size=0
98+    ngx_sys_nerr=0
99+fi
100+
101+cat << END >> $NGX_AUTO_CONFIG_H
102+
103+#ifndef $ngx_feature_name
104+#define $ngx_feature_name $ngx_sys_nerr
105+#endif
106+
107+END
108+
109+echo " $ngx_sys_nerr"
110diff --git a/auto/unix b/auto/unix
111index 7dbf9d1..00a7370 100755
112--- a/auto/unix
113+++ b/auto/unix
114@@ -744,10 +744,18 @@ if [ $ngx_found = no ]; then
115                       #include <stdio.h>'
116     ngx_feature_path=
117     ngx_feature_libs=
118+    if false ; then
119+    # Disabled because only valid for native build.
120     ngx_feature_test='printf("%d", _sys_nerr);'
121     . auto/feature
122 fi
123
124+else
125+    # Cross-compilation support
126+    . auto/os/sys_nerr
127+
128+fi
129+
130
131 ngx_feature="localtime_r()"
132 ngx_feature_name="NGX_HAVE_LOCALTIME_R"
133--
1341.9.1
135
136