xref: /openbsd-src/usr.bin/libtool/LT/Exec.pm (revision f41ccc36c98bb70900c901ba8385dbb26f3cea97)
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