1*f41ccc36Sespie# $OpenBSD: Exec.pm,v 1.6 2023/07/06 08:29:26 espie Exp $ 2dd9b5fdeSespie 3dd9b5fdeSespie# Copyright (c) 2007-2010 Steven Mestdagh <steven@openbsd.org> 4b8664c47Sespie# Copyright (c) 2012 Marc Espie <espie@openbsd.org> 5dd9b5fdeSespie# 6dd9b5fdeSespie# Permission to use, copy, modify, and distribute this software for any 7dd9b5fdeSespie# purpose with or without fee is hereby granted, provided that the above 8dd9b5fdeSespie# copyright notice and this permission notice appear in all copies. 9dd9b5fdeSespie# 10dd9b5fdeSespie# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11dd9b5fdeSespie# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12dd9b5fdeSespie# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13dd9b5fdeSespie# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14dd9b5fdeSespie# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15dd9b5fdeSespie# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16dd9b5fdeSespie# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17dd9b5fdeSespie 18*f41ccc36Sespieuse v5.36; 19dd9b5fdeSespie 20dd9b5fdeSespiepackage LT::Exec; 21f98ddbc5Sespieuse LT::Trace; 2297f6c442Sespieuse LT::Util; 23dd9b5fdeSespie 24*f41ccc36Sespie# OO singleton 25dd9b5fdeSespiemy $dry = 0; 26dd9b5fdeSespiemy $verbose = 0; 27dd9b5fdeSespiemy $performed = 0; 28dd9b5fdeSespie 29*f41ccc36Sespiesub performed($) 30dd9b5fdeSespie{ 31dd9b5fdeSespie return $performed; 32dd9b5fdeSespie} 33dd9b5fdeSespie 34*f41ccc36Sespiesub dry_run($) 35dd9b5fdeSespie{ 36dd9b5fdeSespie $dry = 1; 37dd9b5fdeSespie} 38dd9b5fdeSespie 39*f41ccc36Sespiesub verbose_run($) 40dd9b5fdeSespie{ 41dd9b5fdeSespie $verbose = 1; 42dd9b5fdeSespie} 43dd9b5fdeSespie 44*f41ccc36Sespiesub silent_run($) 45dd9b5fdeSespie{ 46dd9b5fdeSespie $verbose = 0; 47dd9b5fdeSespie} 48dd9b5fdeSespie 49*f41ccc36Sespiesub new($class) 50dd9b5fdeSespie{ 51dd9b5fdeSespie bless {}, $class; 52dd9b5fdeSespie} 53dd9b5fdeSespie 54*f41ccc36Sespiesub chdir($self, $dir) 55dd9b5fdeSespie{ 56dd9b5fdeSespie my $class = ref($self) || $self; 57dd9b5fdeSespie bless {dir => $dir}, $class; 58dd9b5fdeSespie} 59dd9b5fdeSespie 60*f41ccc36Sespiesub compile($self, @l) 61dd9b5fdeSespie{ 62dd9b5fdeSespie $self->command("compile", @l); 63dd9b5fdeSespie} 64dd9b5fdeSespie 65*f41ccc36Sespiesub execute($self, @l) 66dd9b5fdeSespie{ 67dd9b5fdeSespie $self->command("execute", @l); 68dd9b5fdeSespie} 69dd9b5fdeSespie 70*f41ccc36Sespiesub install($self, @l) 71dd9b5fdeSespie{ 72dd9b5fdeSespie $self->command("install", @l); 73dd9b5fdeSespie} 74dd9b5fdeSespie 75*f41ccc36Sespiesub link($self, @l) 76dd9b5fdeSespie{ 77dd9b5fdeSespie $self->command("link", @l); 78dd9b5fdeSespie} 79dd9b5fdeSespie 80*f41ccc36Sespiesub command_run($self, @l) 81dd9b5fdeSespie{ 82dd9b5fdeSespie if ($self->{dir}) { 83f98ddbc5Sespie tprint {"cd $self->{dir} && "}; 84dd9b5fdeSespie } 85f98ddbc5Sespie tsay { "@l" }; 86dd9b5fdeSespie my $pid = fork(); 87484b221cSnaddy if (!defined $pid) { 88dd9b5fdeSespie die "Couldn't fork while running @l\n"; 89dd9b5fdeSespie } 90dd9b5fdeSespie if ($pid == 0) { 91dd9b5fdeSespie if ($self->{dir}) { 92dd9b5fdeSespie CORE::chdir($self->{dir}) or die "Can't chdir to $self->{dir}\n"; 93dd9b5fdeSespie } 94dd9b5fdeSespie exec(@l); 95dd9b5fdeSespie die "Exec failed @l\n"; 96dd9b5fdeSespie } else { 97dd9b5fdeSespie my $kid = waitpid($pid, 0); 98dd9b5fdeSespie if ($? != 0) { 9997f6c442Sespie shortdie "Error while executing @l\n"; 100dd9b5fdeSespie } 101dd9b5fdeSespie } 102dd9b5fdeSespie} 103dd9b5fdeSespie 104*f41ccc36Sespiesub shell($self, @cmds) 105dd9b5fdeSespie{ 106dd9b5fdeSespie # create an object "on the run" 107dd9b5fdeSespie if (!ref($self)) { 108dd9b5fdeSespie $self = $self->new; 109dd9b5fdeSespie } 110dd9b5fdeSespie for my $c (@cmds) { 111dd9b5fdeSespie say $c if $verbose || $dry; 112dd9b5fdeSespie if (!$dry) { 113dd9b5fdeSespie $self->command_run($c); 114dd9b5fdeSespie } 115dd9b5fdeSespie } 116dd9b5fdeSespie $performed++; 117dd9b5fdeSespie} 118dd9b5fdeSespie 119*f41ccc36Sespiesub command($self, $mode, @l) 120dd9b5fdeSespie{ 121dd9b5fdeSespie # create an object "on the run" 122dd9b5fdeSespie if (!ref($self)) { 123dd9b5fdeSespie $self = $self->new; 124dd9b5fdeSespie } 125dd9b5fdeSespie if ($mode eq "compile"){ 126dd9b5fdeSespie say "@l" if $verbose || $dry; 127dd9b5fdeSespie } else { 128dd9b5fdeSespie say "libtool: $mode: @l" if $verbose || $dry; 129dd9b5fdeSespie } 130dd9b5fdeSespie if (!$dry) { 131dd9b5fdeSespie $self->command_run(@l); 132dd9b5fdeSespie } 133dd9b5fdeSespie $performed++; 134dd9b5fdeSespie} 135dd9b5fdeSespie 136dd9b5fdeSespie1; 137