#!/usr/bin/env perl

use FindBin;
use lib $FindBin::Bin;
use Run qw(ret run);
use strict;

my $flag = $ARGV[0];
my $launcher;
my $preset_launcher=$ENV{'CHPL_LAUNCHER'};

if ($preset_launcher eq "") {
    my $comm = run("comm", "--target");
    my $substrate = run("commSubstrate");
    my $platform = run("platform", "--target");
    my $compiler = run("compiler", "--target");

    $launcher = "none";
    if ($platform =~ /^cray-(xc|xe|xk|xt)$/) {
        my $hasAprun =  not system("which aprun > /dev/null 2>&1");
        my $hasSlurm =  not system("which srun > /dev/null 2>&1");
        if ($hasAprun and not $hasSlurm) {
            $launcher = "aprun";
        } elsif ($hasSlurm and not $hasAprun) {
            $launcher = "slurm-srun";
        } else {
            $launcher = "none";
        }
    } elsif ($platform eq "marenostrum") {
        $launcher = "marenostrum";
    } elsif ($compiler eq "tile-cc") {
        $launcher = "tile-monitor";
    } elsif ($comm eq "gasnet") {
        if ($substrate eq "udp") {
            $launcher = "amudprun";
        } elsif ($substrate eq "mpi") {
            $launcher = "gasnetrun_mpi";
        } elsif ($substrate eq "ibv") {
            if ($platform eq "pwr6") {
#
# our loadleveler launcher is not yet portable/stable/flexible enough
# to serve as a good default
#
#   $launcher = "loadleveler";
                $launcher = "none";
            } else {
                $launcher = "gasnetrun_ibv";
            }
        } elsif ($substrate eq "mxm") {
          $launcher = "gasnetrun_ibv";
        } elsif ($substrate eq "lapi") {
#
# our loadleveler code doesn't seem compatible with a pwr5 version
# of loadleveler yet
#
#     $launcher = "loadleveler";
            $launcher = "none";
        }
    } elsif ($comm eq "armci") {
        if ($substrate eq "mpi") {
            $launcher = "mpirun";
        }
    } elsif ($comm eq "mpi") {
        $launcher = "mpirun";
    } elsif ($comm eq "pvm") {
        $launcher = "pvm";
    }
} else {
    $launcher = $preset_launcher;
}

ret($launcher);
print "$launcher\n" unless caller;
