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