wine-strawberry-perl/generate_folder.pl

167 lines
5.3 KiB
Perl

#!/usr/bin/env perl
use v5.38.1;
use strict;
use warnings;
use Path::Tiny;
use File::pushd;
use feature 'signatures';
my @dlls = (
glob('/usr/x86_64-w64-mingw32/usr/bin/*'),
glob('/usr/x86_64-w64-mingw32/usr/lib/*')
);
my $strawberry_zip = path('strawberry-perl-5.38.2.2-64bit-portable.zip');
my @typelibs =
glob('/usr/x86_64-w64-mingw32/usr/lib/girepository-1.0/*.typelib');
my @includes = (
glob('/usr/x86_64-w64-mingw32/usr/include/*'),
'/usr/x86_64-w64-mingw32/usr/lib/glib-2.0/include/glibconfig.h'
);
my @pkgconfigs = glob('/usr/x86_64-w64-mingw32/usr/lib/pkgconfig/*.pc');
# my $destdir = Path::Tiny->tempdir;
my $destdir = path('__gtk_install__')->absolute;
%ENV = (
PERL_LOCAL_LIB_ROOT => $destdir->child('perl'),
PERL_MB_OPT => "--install_base \"@{[$destdir->child('perl')]}\"",
PERL_MM_OPT => "INSTALL_BASE=@{[$destdir->child('perl')]}",
LANG => "C.utf8",
PKG_CONFIG_PATH => $destdir->child('lib/pkgconfig'),
LIBRARY_PATH => "@{[$destdir->child('c/bin')]};@{[$destdir->child('.')]}",
CPATH => "@{[$destdir->child('lib/include/glib-2.0')]};"
. "@{[$destdir->child('lib/include/gobject-introspection-1.0')]};"
. "@{[$destdir->child('lib/include/')]}",
PERL5LIB =>
"@{[$destdir->child('perl/lib/perl5/MSWin32-x64-multi-thread')]};"
. "@{[$destdir->child('perl/lib')]};"
. "@{[$destdir->child('perl/lib/perl5')]};"
. "@{[$destdir->child('perl/vendor/lib')]};@{[$destdir->child('perl/site/lib/')]}",
GI_TYPELIB_PATH => $destdir->child('lib/typelib'),
WINEPATH =>
"@{[$destdir->child('c/bin')]};@{[$destdir->child('perl/bin')]}",
WINEPREFIX => $destdir->child('.wine'),
WINEDEBUG => '-all',
);
system 'unzip', '-d', $destdir, $strawberry_zip;
system 'cp', '-r', @dlls, $destdir->child('c/bin');
system( qw/mkdir -pv/, $destdir->child('lib/include') );
system( qw/mkdir -pv/, $destdir->child('lib/typelib') );
system( qw/mkdir -pv/, $destdir->child('lib/pkgconfig') );
system 'cp', '-r', @includes, $destdir->child('lib/include');
system 'cp', @typelibs, $destdir->child('lib/typelib');
system 'cp', @pkgconfigs, $destdir->child('lib/pkgconfig');
{
my $pushd = pushd $destdir;
execute_wine(
qw{perl},
$destdir->child('perl/bin/cpan.bat'),
qw{-T Glib::Object::Introspection}
);
execute_wine(
qw{perl},
$destdir->child('perl/bin/cpan.bat'),
qw{-T Glib::IO}
);
my $setup_env_file_contents = <<'EOF';
use v5.38.0;
use strict;
use warnings;
use File::Basename;
use Path::Tiny;
my $destdir = path(__FILE__)->parent->absolute;
%ENV = (
PERL_LOCAL_LIB_ROOT => $destdir->child('perl'),
PERL_MB_OPT => "--install_base \"@{[$destdir->child('perl')]}\"",
PERL_MM_OPT => "INSTALL_BASE=@{[$destdir->child('perl')]}",
LANG => "C.utf8",
PKG_CONFIG_PATH => $destdir->child('lib/pkgconfig'),
LIBRARY_PATH => "@{[$destdir->child('c/bin')]};@{[$destdir->child('.')]}",
CPATH => "@{[$destdir->child('lib/include/glib-2.0')]};"
. "@{[$destdir->child('lib/include/gobject-introspection-1.0')]};"
. "@{[$destdir->child('lib/include/')]}",
PERL5LIB =>
"@{[$destdir->child('perl/lib/perl5/MSWin32-x64-multi-thread')]};"
. "@{[$destdir->child('perl/lib')]};"
. "@{[$destdir->child('perl/lib/perl5')]};"
. "@{[$destdir->child('perl/vendor/lib')]};@{[$destdir->child('perl/site/lib/')]}",
GI_TYPELIB_PATH => $destdir->child('lib/typelib'),
PATH =>
"@{[$destdir->child('c/bin')]};@{[$destdir->child('perl/bin')]}",
);
exec 'perl/bin/wperl.exe', $destdir->child('start.pl');
EOF
my $start_c_file_contents = <<'EOF';
#include <unistd.h>
int main() {
return execl( "perl/bin/wperl.exe", "wperl.exe", "-Iperl/lib", "setup_env.pl", (char *)NULL );
}
EOF
my $start_pl_file_contents = <<'EOF';
use v5.38.1;
use strict;
use warnings;
use Glib::IO;
use Glib::Object::Introspection;
Glib::Object::Introspection->setup(
basename => 'Gtk',
version => '4.0',
package => 'Gtk',
);
my $app = Gtk::Application->new('com.example.App', 'default-flags');
$app->signal_connect(activate => sub {
my $win = Gtk::ApplicationWindow->new($app);
$win->set_title('hola');
$win->present;
});
$app->run();
EOF
$destdir->child('start.c')->spew_raw($start_c_file_contents);
$destdir->child('start.pl')->spew_raw($start_pl_file_contents);
$destdir->child('setup_env.pl')->spew_raw($setup_env_file_contents);
execute('rm', '-f', $destdir->child('start.exe'));
execute(
qw{/usr/bin/x86_64-w64-mingw32-gcc -mwindows -o},
$destdir->child('start.exe'),
$destdir->child('start.c'), '-Wl,--subsystem,windows',
);
execute( 'rm', '-r', $destdir->child('.wine'));
execute( 'find', $destdir, '-name', '*.h', '-delete');
execute( 'find', $destdir, '-name', '*.a', '-delete');
execute( 'find', $destdir, '-name', '*.cmake', '-delete');
execute( 'find', $destdir, '-name', '*.idl', '-delete');
execute( 'find', $destdir, '-name', '*.rst', '-delete');
}
sub execute(@command) {
print join( ' ', @command ) . "\n";
if ( system @command ) {
die "Command failed @{[join ' ', @command]}";
}
}
sub execute_wine(@args) {
my @command = ( 'wine', @args );
execute(@command);
}