e2fsprogs: test cross-compiling for Android
cover e2fsprogs: test cross-compiling for Android
This series adds jobs to .github/workflows/ci.yml that cross-compile e2fsprogs for Android. To make that possible, it also fixes a couple warnings and an error that show up when building e2fsprogs for Android using the autotools-based build system.
This applies to the latest 'maint' branch. I've tested that the updated GitHub Actions workflow passes
(https://github.com/ebiggers/e2fsprogs/actions/runs/4486115058).
Eric Biggers (3):
e2fsck: avoid -Wtautological-constant-out-of-range-compare warnings
e2freefrag: don't use linux/fsmap.h when fsmap_sizeof() is missing ci.yml: test cross-compiling for Android
.github/workflows/ci.yml | 33 +++++++++++++++ configure | 91 ++++++++++++++++++++++++++-------------- configure.ac | 6 +++ e2fsck/iscan.c | 3 +- e2fsck/util.c | 3 +- lib/config.h.in | 3 ++ misc/e2freefrag.c | 2 +- 7 files changed, 107 insertions(+), 34 deletions(-)
base-commit: cbc6a5ae4f350bfb0dd0daa39544615a5d0a956a
Signature · 1 line
2.40.0
PATCH 1/3 e2fsck: avoid -Wtautological-constant-out-of-range-compare warnings
From: Eric Biggers <[email protected]>
Fix two compiler warnings on 32-bit platforms that have mallinfo() but not mallinfo2(). These showed up when building e2fsprogs for armv7a or i686 Android using the Android NDK, targeting Android API level 32 or lower and using the autotools-based build system.
--- e2fsck/iscan.c | 3 ++- e2fsck/util.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-)
e2fsck/iscan.c +2 -1
@@ -120,7 +120,8 @@ void print_resource_track(const char *desc, } else#elif defined HAVE_MALLINFO/* don't use mallinfo() if over 2GB used, since it returns "int" */ -if ((char *)sbrk (0 ) - (char *)track->brk_start <2LL <<30 ) { +if ((unsigned long )((char *)sbrk (0 ) - (char *)track->brk_start) < +2UL <<30 ) {struct mallinfo malloc_info =mallinfo (); printf("Memory used: %lluk/%lluk (%lluk/%lluk), ",
e2fsck/util.c +2 -1
@@ -441,7 +441,8 @@ void print_resource_track(e2fsck_t ctx, const char *desc, } else#elif defined HAVE_MALLINFO/* don't use mallinfo() if over 2GB used, since it returns "int" */ -if ((char *)sbrk (0 ) - (char *)track->brk_start <2LL <<30 ) { +if ((unsigned long )((char *)sbrk (0 ) - (char *)track->brk_start) < +2UL <<30 ) {struct mallinfo malloc_info =mallinfo (); log_out(ctx, _("Memory used: %lluk/%lluk (%lluk/%lluk), "),
Signature · 1 line
2.40.0
PATCH 2/3 e2freefrag: don't use linux/fsmap.h when fsmap_sizeof() is missing
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Work around an issue with the Android NDK where its copy of linux/fsmap.h is missing the inline functions fsmap_sizeof() and fsmap_advance(). This was causing an error when building e2fsprogs using the Android NDK, using the autotools-based build system.
--- configure | 91 +++++++++++++++++++++++++++++++---------------- configure.ac | 6 ++++ lib/config.h.in | 3 ++ misc/e2freefrag.c | 2 +- 4 files changed, 70 insertions(+), 32 deletions(-)
configure +60 -31
@@ -8678,7 +8678,7 @@ else $as_nop *-*-aix*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#if defined __powerpc64__ || defined _ARCH_PPC64 +#if defined __powerpc64__ || defined __LP64__ int ok; #else error fail
@@ -8969,7 +8969,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # be generating 64-bit code. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#if defined __powerpc64__ || defined _ARCH_PPC64 +#if defined __powerpc64__ || defined __LP64__ int ok; #else error fail
@@ -9076,7 +9076,7 @@ then : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef __ELF__ +#if defined __ELF__ || (defined __linux__ && defined __EDG__) Extensible Linking Format #endif
@@ -9094,7 +9094,7 @@ rm -rf conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_elf" >&5 printf "%s\n" "$gl_cv_elf" >&6; } - if test $gl_cv_elf; then + if test $gl_cv_elf = yes; then # Extract the ELF class of a file (5th byte) in decimal. # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header if od -A x < /dev/null >/dev/null 2>/dev/null; then
@@ -9111,19 +9111,22 @@ printf "%s\n" "$gl_cv_elf" >&6; } echo } fi + # Use 'expr', not 'test', to compare the values of func_elfclass, because on + # Solaris 11 OpenIndiana and Solaris 11 OmniOS, the result is 001 or 002, + # not 1 or 2. case $HOST_CPU_C_ABI_32BIT in yes) # 32-bit ABI. acl_is_expected_elfclass () { - test "`func_elfclass | sed -e 's/[ ]//g'`" = 1 + expr "`func_elfclass | sed -e 's/[ ]//g'`" = 1 > /dev/null } ;; no) # 64-bit ABI. acl_is_expected_elfclass () { - test "`func_elfclass | sed -e 's/[ ]//g'`" = 2 + expr "`func_elfclass | sed -e 's/[ ]//g'`" = 2 > /dev/null } ;; *)
@@ -9653,7 +9656,14 @@ fi fi ;; -l*) - names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + dep=`echo "X$dep" | sed -e 's/^X-l//'` + if test "X$dep" != Xc \ + || case $host_os in + linux* | gnu* | k*bsd*-gnu) false ;; + *) true ;; + esac; then + names_next_round="$names_next_round $dep" + fi ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
@@ -10015,8 +10025,9 @@ int main (void) { int result = 0; - /* Test against AIX 5.1 bug: Failures are not distinguishable from successful - returns. */ + /* Test against AIX 5.1...7.2 bug: Failures are not distinguishable from + successful returns. This is even documented in + <https://www.ibm.com/support/knowledgecenter/ssw_aix_72/i_bostechref/iconv.html> */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1))
@@ -10598,7 +10609,14 @@ fi fi ;; -l*) - names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + dep=`echo "X$dep" | sed -e 's/^X-l//'` + if test "X$dep" != Xc \ + || case $host_os in + linux* | gnu* | k*bsd*-gnu) false ;; + *) true ;; + esac; then + names_next_round="$names_next_round $dep" + fi ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
@@ -12336,6 +12354,15 @@ then : printf "%s\n" "#define HAVE_LSEEK64_PROTOTYPE 1" >>confdefs.h +fi + +ac_fn_check_decl "$LINENO" "fsmap_sizeof" "ac_cv_have_decl_fsmap_sizeof" "#include <linux/fsmap.h> +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_fsmap_sizeof" = xyes +then : + +printf "%s\n" "#define HAVE_FSMAP_SIZEOF 1" >>confdefs.h + fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
@@ -14776,11 +14803,11 @@ if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } -if test ${ac_cv_prog_cxx_cxx11+y} +if test ${ac_cv_prog_cxx_11+y} then : printf %s "(cached) " >&6 else $as_nop - ac_cv_prog_cxx_cxx11=no + ac_cv_prog_cxx_11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */
@@ -14822,11 +14849,11 @@ if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } -if test ${ac_cv_prog_cxx_cxx98+y} +if test ${ac_cv_prog_cxx_98+y} then : printf %s "(cached) " >&6 else $as_nop - ac_cv_prog_cxx_cxx98=no + ac_cv_prog_cxx_98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */
@@ -15166,7 +15193,7 @@ fi if test $pkg_failed = yes; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@@ -15175,25 +15202,25 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - udev_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "udev" 2>&1` + udev_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "udev" 2>&1` else - udev_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "udev" 2>&1` + udev_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "udev" 2>&1` fi - # Put the nasty error message in config.log where it belongs - echo "$udev_PKG_ERRORS" >&5 + # Put the nasty error message in config.log where it belongs + echo "$udev_PKG_ERRORS" >&5 with_udev_rules_dir="" elif test $pkg_failed = untried; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } with_udev_rules_dir="" else - udev_CFLAGS=$pkg_cv_udev_CFLAGS - udev_LIBS=$pkg_cv_udev_LIBS + udev_CFLAGS=$pkg_cv_udev_CFLAGS + udev_LIBS=$pkg_cv_udev_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; }
@@ -15335,7 +15362,7 @@ fi if test $pkg_failed = yes; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@@ -15344,25 +15371,25 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - systemd_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "systemd" 2>&1` + systemd_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "systemd" 2>&1` else - systemd_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "systemd" 2>&1` + systemd_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "systemd" 2>&1` fi - # Put the nasty error message in config.log where it belongs - echo "$systemd_PKG_ERRORS" >&5 + # Put the nasty error message in config.log where it belongs + echo "$systemd_PKG_ERRORS" >&5 with_systemd_unit_dir="" elif test $pkg_failed = untried; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } with_systemd_unit_dir="" else - systemd_CFLAGS=$pkg_cv_systemd_CFLAGS - systemd_LIBS=$pkg_cv_systemd_LIBS + systemd_CFLAGS=$pkg_cv_systemd_CFLAGS + systemd_LIBS=$pkg_cv_systemd_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; }
@@ -17029,7 +17056,9 @@ printf "%s\n" "$as_me: executing $ac_file commands" >&6;} # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in - "$presentlang"*) useit=yes;; + "$presentlang" | "$presentlang"_* | "$presentlang".* | "$presentlang"@*) + useit=yes + ;; esac done if test $useit = yes; then
configure.ac +6 -0
@@ -1107,6 +1107,12 @@ AC_CHECK_DECL(lseek64,[AC_DEFINE(HAVE_LSEEK64_PROTOTYPE, 1, [#define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #include <unistd.h>]) + +dnl The Android NDK has <linux/fsmap.h>, but it is missing the inline functions +dnl fsmap_sizeof() and fsmap_advance(). Check whether this is the case. +AC_CHECK_DECL(fsmap_sizeof,[AC_DEFINE(HAVE_FSMAP_SIZEOF, 1, + [Define to 1 if fsmap_sizeof() is declared in linux/fsmap.h])],, + [#include <linux/fsmap.h>]) dnl dnl Word sizes... dnl
lib/config.h.in +3 -0
@@ -109,6 +109,9 @@ /* Define to 1 if you have the `fdatasync' function. */ #undef HAVE_FDATASYNC +/* Define to 1 if fsmap_sizeof() is declared in linux/fsmap.h */ +#undef HAVE_FSMAP_SIZEOF + /* Define to 1 if you have the `fstat64' function. */ #undef HAVE_FSTAT64
misc/e2freefrag.c +1 -1
@@ -38,7 +38,7 @@ extern int optind;#include "e2freefrag.h" #if defined(HAVE_EXT2_IOCTLS ) && !defined(DEBUGFS ) -# ifdef HAVE_LINUX_FSMAP_H +# if defined(HAVE_LINUX_FSMAP_H ) && defined(HAVE_FSMAP_SIZEOF )# include <linux/fsmap.h> # endif # include "fsmap.h"
Signature · 1 line
2.40.0
PATCH 3/3 ci.yml: test cross-compiling for Android
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Add jobs that cross-compile e2fsprogs for Android using the Android NDK. These use the autotools-based build system, so they're a bit different from the actual Android builds, but they should still be useful.
--- .github/workflows/ci.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
.github/workflows/ci.yml +33 -0
@@ -126,3 +126,36 @@ jobs: with: name: windows-${{matrix.env}}-config.h path: lib/config.h + + # Jobs that cross-compile e2fsprogs for Android using the Android NDK. Note + # that these use the autotools-based build system, which makes them a bit + # different from the actual Android builds from the Android source tree. + cross-compile-for-android: + name: Cross-compile for Android (${{matrix.arch}}) + strategy: + matrix: + include: + - { arch: aarch64, target: aarch64-linux-android } + - { arch: armv7a, target: armv7a-linux-androideabi } + - { arch: i686, target: i686-linux-android } + - { arch: x86_64, target: x86_64-linux-android } + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + # See https://developer.android.com/ndk/guides/other_build_systems#autoconf + - name: configure + run: | + TOOLCHAIN=$ANDROID_NDK_LATEST_HOME/toolchains/llvm/prebuilt/linux-x86_64 + API_LEVEL=29 # Android 10 + export AR=$TOOLCHAIN/bin/llvm-ar + export CC=$TOOLCHAIN/bin/${{matrix.target}}${API_LEVEL}-clang + export AS=$CC + export LD=$TOOLCHAIN/bin/ld + export RANLIB=$TOOLCHAIN/bin/llvm-ranlib + export STRIP=$TOOLCHAIN/bin/llvm-strip + ./configure --host=${{matrix.target}} CFLAGS="$DEF_CFLAGS" + - run: make -j8 V=1 CFLAGS_WARN="-Werror" + - uses: actions/upload-artifact@v3 + with: + name: android-${{matrix.arch}}-config.h + path: lib/config.h
Signature · 1 line
2.40.0