[PATCH v1] erofs-utils: Fix cross compile with autoconf

Sandeep Dhavale dhavale at google.com
Sun Oct 8 01:51:48 AEDT 2023


On Sat, Oct 7, 2023 at 1:25 AM Gao Xiang <hsiangkao at linux.alibaba.com> wrote:
>
>
>
> On 2023/10/7 15:16, Sandeep Dhavale wrote:
> > On Fri, Oct 6, 2023 at 8:27 PM Gao Xiang <hsiangkao at linux.alibaba.com> wrote:
> >>
> >> Hi Sandeep!
> >>
> >> On 2023/10/6 06:40, Sandeep Dhavale wrote:
> >>> AC_RUN_IFELSE expects the action if cross compiling. If not provided
> >>> cross compilation fails with error "configure: error: cannot run test
> >>> program while cross compiling".
> >>> Use 4096 as the buest guess PAGESIZE if cross compiling as it is still
> >>> the most common page size.
> >>
> >> Thanks for your report!
> >>
> >>>
> >>> Reported-in: https://lore.kernel.org/all/0101018aec71b531-0a354b1a-0b70-47a1-8efc-fea8c439304c-000000@us-west-2.amazonses.com/
> >>> Fixes: 8ee2e591dfd6 ("erofs-utils: support detecting maximum block size")
> >>> Signed-off-by: Sandeep Dhavale <dhavale at google.com>
> >>> ---
> >>>    configure.ac | 4 ++--
> >>>    1 file changed, 2 insertions(+), 2 deletions(-)
> >>>
> >>> diff --git a/configure.ac b/configure.ac
> >>> index 13ee616..a546310 100644
> >>> --- a/configure.ac
> >>> +++ b/configure.ac
> >>> @@ -284,8 +284,8 @@ AS_IF([test "x$MAX_BLOCK_SIZE" = "x"], [
> >>>        return 0;
> >>>    ]])],
> >>>                                 [erofs_cv_max_block_size=`cat conftest.out`],
> >>> -                             [],
> >>> -                             []))
> >>> +                             [erofs_cv_max_block_size=4096],
> >>> +                             [erofs_cv_max_block_size=4096]))
> >>>    ], [erofs_cv_max_block_size=$MAX_BLOCK_SIZE])
> >>
> >> Actually the following check will reset erofs_cv_max_block_size to 4096
> >> if needed. But it seems that it has syntax errors.
> >>
> > Hi Gao,
> > If I understand this correctly, the problem here is not having defined
> > action if we are cross compiling for AC_RUN_IFELSE(). The cross
> > compilation will fail until we have an action defined.
> >
> > While at it I specified erofs_cv_max_block_size=4096 for the second
> > action which will be the value if the test program fails to detect the
> > page size.
>
> Oh, thanks! got it.  How about updating erofs_cv_max_block_size to
> $MAX_BLOCK_SIZE first, and fallback to 4096 if MAX_BLOCK_SIZE is
> not defined? (We need to use $MAX_BLOCK_SIZE if defined anyway...)
>
> I mean applying the following diff in addition to the previous diff too?
>
> +                             [erofs_cv_max_block_size=$MAX_BLOCK_SIZE],
> +                             [erofs_cv_max_block_size=$MAX_BLOCK_SIZE]))
>      ], [erofs_cv_max_block_size=$MAX_BLOCK_SIZE])
>
Hi Gao,
That cannot work because AS_RUN_IFELSE() is only invoked if
MAX_BLOCK_SIZE is not set.

  # Detect maximum block size if necessary
  AS_IF([test "x$MAX_BLOCK_SIZE" = "x"], [
    AC_CACHE_CHECK([sysconf (_SC_PAGESIZE)], [erofs_cv_max_block_size],
                 AC_RUN_IFELSE([AC_LANG_PROGRAM(
  [[
  #include <unistd.h>
  #include <stdio.h>
...

Cross compilation works if MAX_BLOCK_SIZE is set today as is without
any fix. Cross compilation only fails when MAX_BLOCK_SIZE is not set
AND the configure script tries to detect because there is no action
defined regarding what should be erofs_cv_max_block_size.

Thanks,
Sandeep.

> If it works, I could apply this version.
>
> Thanks,
> Gao Xiang
>
> >
> > With your suggested patch, cross compilation still fails with the error
> >> configure: error: cannot run test program while cross compiling
> >> See `config.log' for more details
> >
> > Thanks,
> > Sandeep.
> >
> >> I wonder if the following diff could fix the issue too?
> >>
> >> Thanks,
> >> Gao Xiang
> >>
> >> diff --git a/configure.ac b/configure.ac
> >> index 13ee616..94eec01 100644
> >> --- a/configure.ac
> >> +++ b/configure.ac
> >> @@ -288,6 +288,9 @@ AS_IF([test "x$MAX_BLOCK_SIZE" = "x"], [
> >>                                 []))
> >>    ], [erofs_cv_max_block_size=$MAX_BLOCK_SIZE])
> >>
> >> +AS_IF([test "x$erofs_cv_max_block_size" = "x"],
> >> +      [erofs_cv_max_block_size=4096], [])
> >> +
> >>    # Configure debug mode
> >>    AS_IF([test "x$enable_debug" != "xno"], [], [
> >>      dnl Turn off all assert checking.
> >> @@ -501,9 +504,6 @@ if test "x$have_libdeflate" = "xyes"; then
> >>    fi
> >>
> >>    # Dump maximum block size
> >> -AS_IF([test "x$erofs_cv_max_block_size" = "x"],
> >> -      [$erofs_cv_max_block_size = 4096], [])
> >> -
> >>    AC_DEFINE_UNQUOTED([EROFS_MAX_BLOCK_SIZE], [$erofs_cv_max_block_size],
> >>                     [The maximum block size which erofs-utils supports])


More information about the Linux-erofs mailing list