From: xtkoba+ruby@... Date: 2021-04-12T06:00:40+00:00 Subject: [ruby-core:103395] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition Issue #17793 has been updated by xtkoba (Tee KOBAYASHI). It makes no difference because neither `SIZEOF_DEVT` nor `SIZEOF_DEV_T` is defined on Android (both for 32- and 64-bit). Is this as expected? For armv7a-android16: ``` $ clang (...snip...) -o file.o -c ../file.c -Wundef ../file.c:580:34: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef] #if SIZEOF_STRUCT_STAT_ST_DEV <= SIZEOF_DEV_T ^ ../file.c:756:36: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef] # if SIZEOF_STRUCT_STAT_ST_RDEV <= SIZEOF_DEV_T ^ ../file.c:6269:5: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef] #if SIZEOF_DEV_T > SIZEOF_INT ^ 3 warnings generated. ``` For aarch64-android21: ``` $ clang (...snip...) -o file.o -c ../file.c -Wundef ../file.c:580:5: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef] #if SIZEOF_STRUCT_STAT_ST_DEV <= SIZEOF_DEV_T ^ .ext/include/aarch64-linux-android/ruby/config.h:170:35: note: expanded from macro 'SIZEOF_STRUCT_STAT_ST_DEV' #define SIZEOF_STRUCT_STAT_ST_DEV SIZEOF_DEV_T ^ ../file.c:580:34: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef] #if SIZEOF_STRUCT_STAT_ST_DEV <= SIZEOF_DEV_T ^ ../file.c:756:6: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef] # if SIZEOF_STRUCT_STAT_ST_RDEV <= SIZEOF_DEV_T ^ .ext/include/aarch64-linux-android/ruby/config.h:171:36: note: expanded from macro 'SIZEOF_STRUCT_STAT_ST_RDEV' #define SIZEOF_STRUCT_STAT_ST_RDEV SIZEOF_DEV_T ^ ../file.c:756:36: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef] # if SIZEOF_STRUCT_STAT_ST_RDEV <= SIZEOF_DEV_T ^ ../file.c:6269:5: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef] #if SIZEOF_DEV_T > SIZEOF_INT ^ 5 warnings generated. ``` ---------------------------------------- Bug #17793: `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition https://bugs.ruby-lang.org/issues/17793#change-91489 * Author: xtkoba (Tee KOBAYASHI) * Status: Open * Priority: Normal * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- [Here is a failure log for armv7a-android from CI.](http://rubyci.s3.amazonaws.com/crossruby/crossruby-master-armv7a-android30/log/20210411T143751Z.fail.html.gz) This failure is because `struct stat` for 32-bit Android is defined as follows. Note that the member `st_dev` is of type `unsigned long long` (instead of `dev_t`), and `st_mode` is of type `unsigned int` (instead of `mode_t`). ```c struct stat { unsigned long long st_dev; unsigned char __pad0[4]; unsigned long __st_ino; unsigned int st_mode; nlink_t st_nlink; uid_t st_uid; gid_t st_gid; unsigned long long st_rdev; unsigned char __pad3[4]; long long st_size; unsigned long st_blksize; unsigned long long st_blocks; struct timespec st_atim; struct timespec st_mtim; struct timespec st_ctim; unsigned long long st_ino; }; ``` I personally avoid these errors by passing the following two arguments to `./configure`. I am not 100% sure this results in no other problems. ``` rb_cv_dev_t_convertible=ULL rb_cv_mode_t_convertible=UINT ``` -- https://bugs.ruby-lang.org/ Unsubscribe: