Skip to content

Android/Termux: etc fails to compile because getpwent declarations are unavailable #99

Description

@dvinciguerra-tp

My environment

  • OS: Android/Termux
  • arch: aarch64
  • ruby: 4.0.6
  • ruby gems version: 4.0.16
  • gem version: etc 1.4.6
  • compiler used: clang 21.1.8
  • android api: 36

Description

Installing the etc gem is fails while compiling the native extension:

  gem install etc

The configuration step reports that getpwent() is available in the output:

  checking for getpwent()... yes

However, compilation fails because Android's headers looks like not expose declarations for getpwent() and setpwent():

  etc.c:294:5: error: call to undeclared function 'setpwent'
  etc.c:295:18: error: call to undeclared function 'getpwent'
  error: incompatible integer to pointer conversion

Same problem occurs with older versions of the gem, including 1.4.1 through 1.4.5.

The expected behavior

The extension should either (I think):

  1. Compile successfully when these functions are available for the target android api; or
  2. Correctly detect that they are unavailable and disable only the affected functionality.

Current detection appears to report getpwent() as available even though the generated extension cannot compile against the android headers.

Reproduction process

I try to install ruby using Android Termux

  gem install etc --no-document

Relevant output:

  checking for getpwent()... yes
  ...

  error: call to undeclared function 'setpwent'
  error: call to undeclared function 'getpwent'

The declarations in Termux's pwd.h are guarded by Android API availability macros, for example:

  struct passwd *getpwent(void) __INTRODUCED_IN(26);
  void setpwent(void) __INTRODUCED_IN(26);

The etc extension includes pwd.h when HAVE_GETPWENT is defined, but the declarations are not visible for the API configuration used while compiling Ruby.

This causes a mismatch between the feature detection performed by extconf.rb and the code generated by the extension.

Thanks

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions