JFIF ( %!1!%)+...383-7(-.+  -% &5/------------------------------------------------";!1AQ"aq2#3BRrb*!1"AQa2q#B ?yRd&vGlJwZvK)YrxB#j]ZAT^dpt{[wkWSԋ*QayBbm*&0<|0pfŷM`̬ ^.qR𽬷^EYTFíw<-.j)M-/s yqT'&FKz-([lև<G$wm2*e Z(Y-FVen櫧lҠDwүH4FX1 VsIOqSBۡNzJKzJξcX%vZcFSuMٖ%B ִ##\[%yYꉅ !VĂ1َRI-NsZJLTAPמQ:y״g_g= m֯Ye+Hyje!EcݸࢮSo{׬*h g<@KI$W+W'_> lUs1,o*ʺE.U"N&CTu7_0VyH,q ,)H㲣5<t ;rhnz%ݓz+4 i۸)P6+F>0Tв`&i}Shn?ik܀՟ȧ@mUSLFηh_er i_qt]MYhq 9LaJpPןߘvꀡ\"z[VƬ¤*aZMo=WkpSp \QhMb˒YH=ܒ m`CJt 8oFp]>pP1F>n8(*aڈ.Y݉[iTع JM!x]ԶaJSWҼܩ`yQ`*kE#nNkZKwA_7~ ΁JЍ;-2qRxYk=Uր>Z qThv@.w c{#&@#l;D$kGGvz/7[P+i3nIl`nrbmQi%}rAVPT*SF`{'6RX46PԮp(3W҅U\a*77lq^rT$vs2MU %*ŧ+\uQXVH !4t*Hg"Z챮 JX+RVU+ތ]PiJT XI= iPO=Ia3[ uؙ&2Z@.*SZ (")s8Y/-Fh Oc=@HRlPYp!wr?-dugNLpB1yWHyoP\ѕрiHִ,ِ0aUL.Yy`LSۜ,HZz!JQiVMb{( tژ <)^Qi_`: }8ٱ9_.)a[kSr> ;wWU#M^#ivT܎liH1Qm`cU+!2ɒIX%ֳNړ;ZI$?b$(9f2ZKe㼭qU8I[ U)9!mh1^N0 f_;׆2HFF'4b! yBGH_jтp'?uibQ T#ѬSX5gޒSF64ScjwU`xI]sAM( 5ATH_+s 0^IB++h@_Yjsp0{U@G -:*} TނMH*֔2Q:o@ w5(߰ua+a ~w[3W(дPYrF1E)3XTmIFqT~z*Is*清Wɴa0Qj%{T.ޅ״cz6u6݁h;֦ 8d97ݴ+ޕxзsȁ&LIJT)R0}f }PJdp`_p)əg(ŕtZ 'ϸqU74iZ{=Mhd$L|*UUn &ͶpHYJۋj /@9X?NlܾHYxnuXږAƞ8j ໲݀pQ4;*3iMlZ6w ȵP Shr!ݔDT7/ҡϲigD>jKAX3jv+ ߧز #_=zTm¦>}Tց<|ag{E*ֳ%5zW.Hh~a%j"e4i=vױi8RzM75i֟fEu64\էeo00d H韧rȪz2eulH$tQ>eO$@B /?=#٤ǕPS/·.iP28s4vOuz3zT& >Z2[0+[#Fޑ]!((!>s`rje('|,),y@\pЖE??u˹yWV%8mJ iw:u=-2dTSuGL+m<*צ1as&5su\phƃ qYLֳ>Y(PKi;Uڕp ..!i,54$IUEGLXrUE6m UJC?%4AT]I]F>׹P9+ee"Aid!Wk|tDv/ODc/,o]i"HIHQ_n spv"b}}&I:pȟU-_)Ux$l:fژɕ(I,oxin8*G>ÌKG}Rڀ8Frajٷh !*za]lx%EVRGYZoWѮ昀BXr{[d,t Eq ]lj+ N})0B,e iqT{z+O B2eB89Cڃ9YkZySi@/(W)d^Ufji0cH!hm-wB7C۔֛X$Zo)EF3VZqm)!wUxM49< 3Y .qDfzm |&T"} {*ih&266U9* <_# 7Meiu^h--ZtLSb)DVZH*#5UiVP+aSRIª!p挤c5g#zt@ypH={ {#0d N)qWT kA<Ÿ)/RT8D14y b2^OW,&Bcc[iViVdִCJ'hRh( 1K4#V`pِTw<1{)XPr9Rc 4)Srgto\Yτ~ xd"jO:A!7􋈒+E0%{M'T^`r=E*L7Q]A{]A<5ˋ.}<9_K (QL9FЍsĮC9!rpi T0q!H \@ܩB>F6 4ۺ6΋04ϲ^#>/@tyB]*ĸp6&<џDP9ᗟatM'> b쪗wI!܁V^tN!6=FD܆9*? q6h8  {%WoHoN.l^}"1+uJ ;r& / IɓKH*ǹP-J3+9 25w5IdcWg0n}U@2 #0iv腳z/^ƃOR}IvV2j(tB1){S"B\ ih.IXbƶ:GnI F.^a?>~!k''T[ע93fHlNDH;;sg-@, JOs~Ss^H '"#t=^@'W~Ap'oTڭ{Fن̴1#'c>꜡?F颅B L,2~ת-s2`aHQm:F^j&~*Nūv+{sk$F~ؒ'#kNsٗ D9PqhhkctԷFIo4M=SgIu`F=#}Zi'cu!}+CZI7NuŤIe1XT xC۷hcc7 l?ziY䠩7:E>k0Vxypm?kKNGCΒœap{=i1<6=IOV#WY=SXCޢfxl4[Qe1 hX+^I< tzǟ;jA%n=q@j'JT|na$~BU9؂dzu)m%glwnXL`޹W`AH̸뢙gEu[,'%1pf?tJ Ζmc[\ZyJvn$Hl'<+5[b]v efsЁ ^. &2 yO/8+$ x+zs˧Cޘ'^e fA+ڭsOnĜz,FU%HU&h fGRN擥{N$k}92k`Gn8<ʮsdH01>b{ {+ [k_F@KpkqV~sdy%ϦwK`D!N}N#)x9nw@7y4*\ Η$sR\xts30`O<0m~%U˓5_m ôªs::kB֫.tpv쌷\R)3Vq>ٝj'r-(du @9s5`;iaqoErY${i .Z(Џs^!yCϾ˓JoKbQU{௫e.-r|XWլYkZe0AGluIɦvd7 q -jEfۭt4q +]td_+%A"zM2xlqnVdfU^QaDI?+Vi\ϙLG9r>Y {eHUqp )=sYkt,s1!r,l鄛u#I$-֐2A=A\J]&gXƛ<ns_Q(8˗#)4qY~$'3"'UYcIv s.KO!{, ($LI rDuL_߰ Ci't{2L;\ߵ7@HK.Z)4
Devil Killer Is Here MiNi Shell

MiNi SheLL

Current Path : /bin/

Linux 9dbcd5f6333d 5.15.0-124-generic #134-Ubuntu SMP Fri Sep 27 20:20:17 UTC 2024 x86_64
Upload File :
Current File : //bin/make-first-existing-target

#!/usr/bin/perl
use warnings;
use strict;
use Getopt::Long;
use IPC::Open3;
use Carp;

our $VERSION = 1.0;

sub usage {
  print STDERR 'usage: make-first-existing-target [-c cmd] '
    . "target1 [target2 ...] -- [make-options]\n"
    or croak "Could not print: $!";
  exit 1;
} ## end sub usage

my ( @targets, @makeopts );
my $makecmd = 'make';

getopt();

# Observe make's stderr on a non-existing target.
my $dummy_target = 'make-first-existing-target-dummy-nonexistant-target';
my $dummy_result = observe_dummy();

foreach my $target (@targets) {
  make( $target, $dummy_result );
}
error("*** No rules to make targets: @targets");

sub make {

  # Runs make on a target, passing stdout, and observing stderr
  # to see if it is similar to that observed when running the dummy
  # target.
  # Only returns if the target appears not to exist.
  my $target = shift;

  # make's stderr will vary from dummy by target name
  my @dummy = map { s/$dummy_target/$target/msxg; $_ } split /\n/msx, shift;

  my $same = 1;
  my @stderr_buf;
  my $code = make_stderr(
    $target,
    sub {
      chomp;
      if ( @dummy && $_ eq $dummy[0] ) {
        push @stderr_buf, "$_\n";
        shift @dummy;
      }
      else {
        print STDERR @stderr_buf or croak "Could not print: $!";
        print STDERR "$_\n" or croak "Could not print: $!";
        $same = 0;
        @stderr_buf = @dummy = ();
      } ## end else [ if ( @dummy && $_ eq $dummy...)]
    }
  );

  if ( !$same || @dummy ) {
    print @stderr_buf or croak "Could not print: $!";
    exit exitcode();
  }
} ## end sub make

sub observe_dummy {
  my $stderr = q{};
  my $code = make_stderr( $dummy_target, sub { $stderr .= shift }, 1 );

  if ( $code != 2 || !length $stderr ) {

    # Could loop and try another target, but in the unlikely
    # case the dummpy target exists, we don't know what it did,
    # so best to treat this as a failure.
    error("unexpected result running $dummy_target: $stderr");
  } ## end if ( $code != 2 || !length...)

  return $stderr;
} ## end sub observe_dummy

sub make_stderr {

  # Runs make on a target, passing each line of stderr to a callback
  # function. Returns make's exit code.
  my $target   = shift;
  my $callback = shift;
  my $silent   = shift;

  # Normally open3 will close the stdin filehandle when done.
  # But we want to call it repeatedly until one target successfully
  # runs; and that target should be able to read from stdin.
  # So, make a dup filehandle, in order to leave stdin open.
  open( MAKEIN, "<&STDIN" ) || die "$!";

  if ( !$silent ) {
    open( MAKEOUT, ">&STDOUT" ) || die "$!";
  }
  else {
    open( MAKEOUT, ">/dev/null" ) || die "$!";
  }

  my $pid = open3( '<&MAKEIN', '>&MAKEOUT', \*MAKEERR,
    $makecmd, @makeopts, $target );
  while (<MAKEERR>) {
    $callback->($_);
  }
  waitpid( $pid, 0 );
  close MAKEIN;
  close MAKEOUT;
  return exitcode();
} ## end sub make_stderr

sub exitcode {
  my $code = $? >> 8;
  if ( !$code && $? ) {
    $code = $?;
  }
  return $code;
} ## end sub exitcode

sub error {
  print STDERR "make-first-existing-target: @_\n";
  exit 2;
}

sub getopt {
  GetOptions(
    "h|help" => \&usage,
    "c=s"    => \$makecmd,
  ) || usage();

  # remainder are targets, possibly followed by makeopts
  my $end = 0;
  foreach my $a (@ARGV) {
    if ( $end || $a =~ /^-/ ) {
      $end = 1;
      push @makeopts, $a;
    }
    else {
      push @targets, $a;
    }
  } ## end foreach my $a (@ARGV)

  @targets || usage();
} ## end sub getopt

__END__

=head1 NAME

make-first-existing-target - runs make on one of several targets

=head1 SYNOPSIS

make-first-existing-target [-c cmd] target1 [target2 ...] -- [make-options]

=cut

=head1 DESCRIPTION

The design of L<make(1)> causes difficulty when you know that a Makefile
probably has one of several standardized target names, and want build
machinery to run exactly one of them, propagating any errors. L<make(1)>
will exit 2 if a target does not exist, but an existing target may also
exit 2 due to some other failure. Makefiles cannot be reliably parsed
to find targets by anything less turing complete than make; and make itself
does not provide a way to enumerate the targets in a Makefile. It may not
even be possible to enumerate the targets in a Makefile without executing
part of it. (Proof of this is left as an exercise for the reader.)

This program avoids the problems described above, by attempting to call
each specified target in turn, until it observes make actually doing
something for one of them.

=head1 OPTIONS

=over 4

=item -c cmd

This can be used to specify the make command to run. Default is "make".

=back

=cut

=head1 EXIT STATUS

The exit status is 0 if at least one target existed and was successfully
run, and nonzero otherwise.

=head1 AUTHOR

Joey Hess <joey@kitenet.net>

=head1 LICENSE

Same as GNU make.

=head1 SEE ALSO

L<make(1)>

=cut

Creat By MiNi SheLL
Email: jattceo@gmail.com