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 )