Alien-xmake

 view release on metacpan or  search on metacpan

builder/xmake.pm  view on Meta::CPAN

        open my $fh, '<', $file or die;
        local $/ = undef;
        my $cont = <$fh>;
        close $fh;
        return $cont;
    }

    # Module::Build subclass
    sub ACTION_xmake_install {
        my ($s) = @_;

        #~ ddx $s->config_data;
        return 1 if $s->config_data('xmake_install');
        #
        my $os = $s->os_type;    # based on Perl::OSType
        if ( !defined $os ) {
            $s->log_warn(
                q[Whoa. Perl has no idea what this OS is so... let's try installing with a shell script and hope for the best!]
            );
            exit 1;
        }
        elsif ( $os eq 'Windows' ) {
            $s->config_data( xmake_type => 'share' );
            my $installer = $s->download( $installer_exe, 'xmake_installer.exe' );
            my $dest      = File::Spec->rel2abs(
                File::Spec->catdir( $s->base_dir, @{ $s->share_dir->{dist} } ) );
            $s->log_info(qq[Running installer [$installer]...\n]);
            $s->do_system( $installer, '/NOADMIN', '/S', '/D=' . $dest );
            $s->log_info(qq[Installed to $dest\n]);
            push @PATH, $dest;
            my $xmake = $s->locate_xmake();
            $s->config_data( xmake_type => 'share' );
            $s->gather_info($xmake);
            $s->config_data( xmake_install => $dest );

# D:\a\_temp\1aa1c77c-ff7b-41bc-8899-98e4cd421618.exe /NOADMIN /S /D=C:\Users\RUNNER~1\AppData\Local\Temp\xmake-15e5f277191e8a088998d0f797dd1f44b5491e17
#~ $s->warn_info('Windows is on the todo list');
#~ exit 1;
        }
        else {
            unshift @PATH, 'share/bin';
            my $xmake = $s->locate_xmake();
            if ($xmake) {
                $s->config_data( xmake_type => 'system' );
            }
            else {
                $s->build_from_source();
                $xmake = $s->locate_xmake();
                #
                $s->config_data( xmake_type => 'share' );
            }
            $s->config_data( xmake_install => $xmake );
            $s->gather_info($xmake);
            return File::Spec->rel2abs($xmake);
        }
    }

    sub ACTION_code {
        my ($s) = @_;
        $s->depends_on('xmake_install');
        $s->SUPER::ACTION_code;
    }

    sub sudo {    # `id -u`;
        CORE::state $sudo;
        return $sudo if defined $sudo;
        $sudo = 'sudo' if !system 'sudo', '--version';
        $sudo //= '';
        return $sudo;
    }

    sub package_installer {
        CORE::state $pkg;
        return $pkg if defined $pkg;
        my %options = (
            apt        => 'apt --version',            # debian, etc.
            yum        => 'apt --version',
            zypper     => 'zypper --version',
            pacman     => 'pacman -V',                # arch, etc.
            emerge     => 'emerge -V',                # Gentoo
            pkg_termux => 'pkg list-installed',       # termux (Android)
            pkg_bsd    => 'pkg help',                 # freebsd
            nixos      => 'nix-env --version',
            apk        => 'apk --version',
            xbps       => 'xbps-install --version',
            scoop      => 'scoop --version',          # Windows
            winget     => 'winget --version',         # Windows
            brew       => 'brew --version',           # MacOS
            dnf        => 'dnf --help',               # Fedora, RHEL, OpenSUSE, CentOS
        );
        warn 'Looking for package manager...';
        no warnings 'exec';
        for my $plat ( keys %options ) {
            if ( system( $options{$plat} ) == 0 ) {
                $pkg = $plat;
                return $pkg;
            }
        }
    }

    sub build_from_source {
        my $s = shift;

        # get make
        my $make;
        {
            for (qw[make gmake]) {
                if ( `$_ --version` =~ /GNU Make/ ) {
                    $make = $_;
                    last;
                }
            }
            $make // warn 'Please install gmake';
        }
        my $compiler;
        {
            my ( $fh, $filename ) = tempfile();
            syswrite $fh, "#include <stdio.h>\nint main(){return 0;}";
            for (qw[gcc cc clang]) {
                if ( !system $_, qw'-x c', $filename,
                    qw'-o /dev/null -I/usr/include -I/usr/local/include' ) {



( run in 0.765 second using v1.01-cache-2.11-cpan-39bf76dae61 )