Chandra
view release on metacpan or search on metacpan
lib/Chandra/Pack.pm view on Meta::CPAN
my $plist = <<PLIST;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key><string>$self->{name}</string>
<key>CFBundleIdentifier</key><string>$self->{identifier}</string>
<key>CFBundleVersion</key><string>$self->{version}</string>
<key>CFBundleShortVersionString</key><string>$self->{version}</string>
<key>CFBundleExecutable</key><string>${\ lc($safe) }</string>
<key>CFBundlePackageType</key><string>APPL</string>
<key>NSHighResolutionCapable</key><true/>
<key>LSEnvironment</key>
<dict>
<key>PATH</key><string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
PLIST
if ($has_icon) {
$plist .= " <key>CFBundleIconFile</key><string>app</string>\n";
}
$plist .= "</dict>\n</plist>\n";
return $plist;
}
sub _compile_launcher_macos {
my ($self, $output) = @_;
my $perl = $self->{perl};
chomp(my $full_perl = `which $perl` || $perl);
my $c_src = <<'CSRC';
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libgen.h>
#include <limits.h>
int main(int argc, char **argv) {
char exe[PATH_MAX], dir[PATH_MAX], resources[PATH_MAX];
char lib[PATH_MAX], perl5lib[PATH_MAX * 2];
char script[PATH_MAX];
/* Find our own location */
uint32_t sz = sizeof(exe);
if (_NSGetExecutablePath(exe, &sz) != 0) {
fprintf(stderr, "Cannot determine executable path\n");
return 1;
}
realpath(exe, dir);
char *d = dirname(dir);
snprintf(resources, sizeof(resources), "%s/../Resources", d);
snprintf(lib, sizeof(lib), "%s/lib", resources);
snprintf(script, sizeof(script), "%s/script.pl", resources);
/* Set PERL5LIB */
const char *existing = getenv("PERL5LIB");
if (existing && *existing)
snprintf(perl5lib, sizeof(perl5lib), "%s:%s", lib, existing);
else
snprintf(perl5lib, sizeof(perl5lib), "%s", lib);
setenv("PERL5LIB", perl5lib, 1);
CSRC
$c_src .= " execl(\"$full_perl\", \"$full_perl\", script, (char *)NULL);\n";
$c_src .= <<'CSRC';
perror("exec");
return 1;
}
CSRC
require File::Temp;
my $tmp = File::Temp->new(SUFFIX => '.c', UNLINK => 1);
print $tmp $c_src;
close $tmp;
my $cmd = "cc -o \Q$output\E -framework Foundation \Q$tmp\E 2>&1";
my $out = `$cmd`;
if ($? != 0) {
die "Failed to compile macOS launcher: $out\n";
}
}
sub _generate_launcher_macos {
my ($self) = @_;
my $perl = $self->{perl};
return <<'LAUNCHER';
#!/bin/bash
DIR="$(cd "$(dirname "$0")" && pwd)"
export PERL5LIB="$DIR/../Resources/lib:$PERL5LIB"
exec "$perl" "$DIR/../Resources/script.pl" "$@"
LAUNCHER
}
sub _generate_launcher_linux {
my ($self) = @_;
my $perl = $self->{perl};
return <<LAUNCHER;
#!/bin/bash
DIR="\$(cd "\$(dirname "\$0")" && pwd)"
export PERL5LIB="\$DIR/usr/lib/perl5:\$PERL5LIB"
exec "$perl" "\$DIR/usr/share/script.pl" "\$@"
LAUNCHER
}
sub _generate_launcher_windows {
my ($self) = @_;
my $perl = $self->{perl};
return <<LAUNCHER;
\@echo off
set DIR=%~dp0
set PERL5LIB=%DIR%lib;%PERL5LIB%
"$perl" "%DIR%script.pl" %*
LAUNCHER
}
sub _generate_desktop {
my ($self) = @_;
my $safe = lc(_safe_name($self->{name}));
my $icon_ext = '';
$icon_ext = file_extname($self->{icon}) if $self->{icon} && file_exists($self->{icon});
return <<DESKTOP;
( run in 1.085 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )