[Pkg-nginx-maintainers] Bug#912284: nginx FTCBFS: multiple reasons

Helmut Grohne helmut at subdivi.de
Mon Oct 29 20:34:01 GMT 2018


Source: nginx
Version: 1.14.0-1
Tags: patch
User: helmutg at debian.org
Usertags: rebootstrap

nginx fails to cross build from source for multiple reasons. Upstream
does not support cross compilation and it is not clear whether doing so
is feasible at all. Yet, I found a number of easy fixes I would like to
share with you:

 * debian/rules checks DEB_BUILD_ARCH for sparc, but it should be
   checking DEB_HOST_ARCH.
 * debian/rules should be passing documented options such as
   --crossbuild or --with-cc to ./configure.
 * auto/cc/name requires running compiled binaries, but that's not
   strictly necessary.
 * auto/types/sizeof also requires running compiled binaries.

The attached patch fixes all of the issues above. After applying it,
nginx fails finding accept4, struct in6_pktinfo and NGX_SYS_NERR.
Likely, some checks are still broken. Still I think that the patch is an
incremental step in the right direction. Please consider applying it and
close this bug when doing so.

Helmut
-------------- next part --------------
diff --minimal -Nru nginx-1.14.0/debian/changelog nginx-1.14.0/debian/changelog
--- nginx-1.14.0/debian/changelog	2018-08-31 14:28:04.000000000 +0200
+++ nginx-1.14.0/debian/changelog	2018-10-29 20:57:17.000000000 +0100
@@ -1,3 +1,10 @@
+nginx (1.14.0-1.1) UNRELEASED; urgency=medium
+
+  * Non-maintainer upload.
+  * Improve cross compilation: (Closes: #-1)
+    + Fix build/host confusion in debian/rules.
+    + Pass --crossbuild and --with-cc to ./configure for cross compilation.
+    + cross.patch: Detect C compiler without running host binaries.
+    + cross.patch: Make auto/types/sizeof work without running host binaries.
+
+ -- Helmut Grohne <helmut at subdivi.de>  Mon, 29 Oct 2018 20:57:17 +0100
+
 nginx (1.14.0-1) unstable; urgency=medium
 
   [ Kartik Mistry ]
diff --minimal -Nru nginx-1.14.0/debian/patches/cross.patch nginx-1.14.0/debian/patches/cross.patch
--- nginx-1.14.0/debian/patches/cross.patch	1970-01-01 01:00:00.000000000 +0100
+++ nginx-1.14.0/debian/patches/cross.patch	2018-10-29 20:57:17.000000000 +0100
@@ -0,0 +1,86 @@
+--- nginx-1.14.0.orig/auto/cc/name
++++ nginx-1.14.0/auto/cc/name
+@@ -7,7 +7,7 @@
+ 
+     ngx_feature="C compiler"
+     ngx_feature_name=
+-    ngx_feature_run=yes
++    ngx_feature_run=compile
+     ngx_feature_incs=
+     ngx_feature_path=
+     ngx_feature_libs=
+--- nginx-1.14.0.orig/auto/types/sizeof
++++ nginx-1.14.0/auto/types/sizeof
+@@ -26,8 +26,8 @@
+ $NGX_INCLUDE_AUTO_CONFIG_H
+ 
+ int main(void) {
+-    printf("%d", (int) sizeof($ngx_type));
+-    return 0;
++    int x[sizeof($ngx_type) == 8 ? 1 : -1] = {};
++    return x;
+ }
+ 
+ END
+@@ -36,27 +36,35 @@
+ ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \
+           -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"
+ 
+-eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"
+-
+-
+-if [ -x $NGX_AUTOTEST ]; then
+-    ngx_size=`$NGX_AUTOTEST`
++if eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"; then
++    ngx_size=8
+     echo " $ngx_size bytes"
+-fi
++    ngx_max_value=9223372036854775807LL
++    ngx_max_len='(sizeof("-9223372036854775808") - 1)'
++else
++    cat << END > $NGX_AUTOTEST.c
+ 
++#include <sys/types.h>
++#include <sys/time.h>
++$NGX_INCLUDE_UNISTD_H
++#include <signal.h>
++#include <stdio.h>
++#include <sys/resource.h>
++$NGX_INCLUDE_INTTYPES_H
++$NGX_INCLUDE_AUTO_CONFIG_H
+ 
+-case $ngx_size in
+-    4)
++int main(void) {
++    int x[sizeof($ngx_type) == 4 ? 1 : -1] = {};
++    return x;
++}
++
++END
++    if eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"; then
++        ngx_size=4
++        echo " $ngx_size bytes"
+         ngx_max_value=2147483647
+         ngx_max_len='(sizeof("-2147483648") - 1)'
+-    ;;
+-
+-    8)
+-        ngx_max_value=9223372036854775807LL
+-        ngx_max_len='(sizeof("-9223372036854775808") - 1)'
+-    ;;
+-
+-    *)
++    else
+         echo
+         echo "$0: error: can not detect $ngx_type size"
+ 
+@@ -69,7 +77,8 @@
+         rm -rf $NGX_AUTOTEST*
+ 
+         exit 1
+-esac
++    fi
++fi
+ 
+ 
+ rm -rf $NGX_AUTOTEST*
diff --minimal -Nru nginx-1.14.0/debian/patches/series nginx-1.14.0/debian/patches/series
--- nginx-1.14.0/debian/patches/series	2018-08-31 14:28:04.000000000 +0200
+++ nginx-1.14.0/debian/patches/series	2018-10-29 20:57:17.000000000 +0100
@@ -1,2 +1,3 @@
 0002-Make-sure-signature-stays-the-same-in-all-nginx-buil.patch
 0003-define_gnu_source-on-other-glibc-based-platforms.patch
+cross.patch
diff --minimal -Nru nginx-1.14.0/debian/rules nginx-1.14.0/debian/rules
--- nginx-1.14.0/debian/rules	2018-08-31 14:28:04.000000000 +0200
+++ nginx-1.14.0/debian/rules	2018-10-29 20:57:17.000000000 +0100
@@ -1,6 +1,7 @@
 #!/usr/bin/make -f
 export DH_VERBOSE=1
 
+include /usr/share/dpkg/architecture.mk
 export DEB_BUILD_MAINT_OPTIONS=hardening=+all
 debian_cflags:=$(shell dpkg-buildflags --get CFLAGS) -fPIC $(shell dpkg-buildflags --get CPPFLAGS)
 debian_ldflags:=$(shell dpkg-buildflags --get LDFLAGS) -fPIC
@@ -31,8 +32,7 @@
 BASEDIR = $(CURDIR)
 $(foreach flavour,$(FLAVOURS),$(eval BUILDDIR_$(flavour) = $(CURDIR)/debian/build-$(flavour)))
 
-DEB_BUILD_ARCH ?=$(shell dpkg-architecture -qDEB_BUILD_ARCH)
-ifeq ($(DEB_BUILD_ARCH),sparc)
+ifeq ($(DEB_HOST_ARCH),sparc)
 	debian_cflags += -m32 -mcpu=ultrasparc
 endif
 
@@ -71,6 +71,12 @@
 			--with-http_slice_module \
 			--with-threads
 
+ifneq ($(DEB_BUILD_ARCH),$(DEB_HOST_ARCH))
+os_map_linux=Linux
+common_configure_flags += --crossbuild=$(or $(os_map_$(DEB_HOST_ARCH_OS)),$(DEB_HOST_ARCH_OS))
+common_configure_flags += --with-cc=$(DEB_HOST_GNU_TYPE)-gcc
+endif
+
 light_configure_flags := \
 			$(common_configure_flags) \
 			--with-http_gzip_static_module \


More information about the Pkg-nginx-maintainers mailing list