xref: /openbsd-src/usr.bin/libtool/LT/Mode/Compile.pm (revision 0a6aab58a9ecdd9d26650fde0b817a724ac8dbc6)
1c81ca2caSespie# ex:ts=8 sw=4:
2*0a6aab58Sespie# $OpenBSD: Compile.pm,v 1.14 2023/07/08 08:15:32 espie Exp $
3c81ca2caSespie#
4c81ca2caSespie# Copyright (c) 2007-2010 Steven Mestdagh <steven@openbsd.org>
5c81ca2caSespie# Copyright (c) 2012 Marc Espie <espie@openbsd.org>
6c81ca2caSespie#
7c81ca2caSespie# Permission to use, copy, modify, and distribute this software for any
8c81ca2caSespie# purpose with or without fee is hereby granted, provided that the above
9c81ca2caSespie# copyright notice and this permission notice appear in all copies.
10c81ca2caSespie#
11c81ca2caSespie# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12c81ca2caSespie# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13c81ca2caSespie# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14c81ca2caSespie# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15c81ca2caSespie# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16c81ca2caSespie# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17c81ca2caSespie# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18*0a6aab58Sespieuse v5.36;
19ee5be365Sespie
20c81ca2caSespiepackage LT::Mode::Compile;
2164a5d04fSespieour @ISA = qw(LT::Mode);
22c81ca2caSespie
23c81ca2caSespieuse File::Basename;
24c81ca2caSespieuse LT::LoFile;
25c81ca2caSespieuse LT::Util;
26f98ddbc5Sespieuse LT::Trace;
27c81ca2caSespie
28*0a6aab58Sespiesub help($)
29ec47798dSespie{
30ec47798dSespie	print <<"EOH";
31ec47798dSespie
32ec47798dSespieUsage: $0 --mode=compile COMPILE-COMMAND [opts] SOURCE
33ec47798dSespieCompile source file into library object
34ec47798dSespie
35ec47798dSespie  -o OUTPUT-FILE
36ec47798dSespieEOH
37ec47798dSespie}
38ec47798dSespie
39c81ca2caSespiemy @valid_src = qw(asm c cc cpp cxx f s);
40*0a6aab58Sespiesub run($class, $ltprog, $gp, $ltconfig)
41c81ca2caSespie{
42c81ca2caSespie	my $lofile = LT::LoFile->new;
43c81ca2caSespie
44562a0ecfSespie	my $pic = !$ltconfig->noshared;
45d1c91ecfSespie	my $nonpic = 1;
46d1c91ecfSespie	if ($gp->has_tag('disable-shared')) {
47d1c91ecfSespie		$pic = 0;
48d1c91ecfSespie	}
49d1c91ecfSespie	if ($gp->has_tag('disable-static') && $pic) {
50d1c91ecfSespie		$nonpic = 0;
51d1c91ecfSespie	}
52d1c91ecfSespie
53d1c91ecfSespie	my $pic_mode = 0;
54d1c91ecfSespie
55d1c91ecfSespie	my @pie_flags = ();
56d1c91ecfSespie
574753e5f2Sespie	$gp->handle_permuted_options('o:!@',
5892d5e529Sespie		qr{\-Wc\,(.*)},
5992d5e529Sespie		    sub {
6092d5e529Sespie			$gp->keep_for_later(split(/\,/, shift));
6192d5e529Sespie		    },
62deab3a89Sespie		'Xcompiler:',
6392d5e529Sespie		    sub {
64deab3a89Sespie			$gp->keep_for_later($_[2]);
6592d5e529Sespie		    },
66d1c91ecfSespie		'pie|fpie|fPIE',
67d1c91ecfSespie		    sub {
68d1c91ecfSespie			push(@pie_flags, $_[3]);
69d1c91ecfSespie		    },
70d1c91ecfSespie		'no-suppress', # we just ignore that one
71d1c91ecfSespie		'prefer-pic', sub { $pic_mode = 1; },
72d1c91ecfSespie		'prefer-non-pic', sub { $pic_mode =  0; },
73d1c91ecfSespie		'static',
74d1c91ecfSespie		    sub {
75d1c91ecfSespie			$pic = 0;
76d1c91ecfSespie			$nonpic = 1;
77d1c91ecfSespie		    },
78d1c91ecfSespie		'shared',
79d1c91ecfSespie		    sub {
80d1c91ecfSespie			if (!$pic) {
81d1c91ecfSespie				shortdie "bad configuration: can't build shared library";
82d1c91ecfSespie			}
83d1c91ecfSespie			$nonpic = 0;
84d1c91ecfSespie		    });
85c81ca2caSespie
86c81ca2caSespie	my ($outfile, $odir, $ofile, $srcfile, $srcext);
87c81ca2caSespie	# XXX check whether -c flag is present and if not, die?
8859f6d0a5Sespie	if ($gp->o) {
8959f6d0a5Sespie		if ($gp->o > 1) {
90abc6d500Sespie			shortdie "Can't specify -o more than once\n";
91abc6d500Sespie		}
92c81ca2caSespie		# fix extension if needed
9359f6d0a5Sespie		($outfile = ($gp->o)[0]) =~ s/\.o$/.lo/;
94c81ca2caSespie		$odir = dirname($outfile);
95c81ca2caSespie		$ofile = basename($outfile);
96c81ca2caSespie	} else {
97c81ca2caSespie		# XXX sometimes no -o flag is present and we need another way
98c81ca2caSespie		my $srcre = join '|', @valid_src;
99c81ca2caSespie		my $found = 0;
100abc6d500Sespie		foreach my $a (@main::ARGV) {
101c81ca2caSespie			if ($a =~ m/\.($srcre)$/i) {
102c81ca2caSespie				$srcfile = $a;
103c81ca2caSespie				$srcext = $1;
104c81ca2caSespie				$found = 1;
105c81ca2caSespie				last;
106c81ca2caSespie			}
107c81ca2caSespie		}
108c81ca2caSespie		$found or die "Cannot find source file in command\n";
109c81ca2caSespie		# the output file ends up in the current directory
110c81ca2caSespie		$odir = '.';
111f98ddbc5Sespie		($ofile = basename($srcfile)) =~ s/\.($srcext)$/.lo/i;
112c81ca2caSespie		$outfile = "$odir/$ofile";
113c81ca2caSespie	}
114f98ddbc5Sespie	tsay {"srcfile = $srcfile"} if $srcfile;
115f98ddbc5Sespie	tsay {"outfile = $outfile"};
116c81ca2caSespie	(my $nonpicobj = $ofile) =~ s/\.lo$/.o/;
117c81ca2caSespie	my $picobj = "$ltdir/$nonpicobj";
118c81ca2caSespie
119c81ca2caSespie	$lofile->{picobj} = $picobj if $pic;
120c81ca2caSespie	$lofile->{nonpicobj} = $nonpicobj if $nonpic;
121562a0ecfSespie	$lofile->{picflags} = $ltconfig->picflags;
122d1c91ecfSespie	if ($pic_mode) {
123562a0ecfSespie		$lofile->{nonpicflags} = $ltconfig->picflags;
124d1c91ecfSespie	} else {
125d1c91ecfSespie		$lofile->{nonpicflags} = \@pie_flags;
126d1c91ecfSespie	}
127c81ca2caSespie	$lofile->compile($ltprog, $odir, \@ARGV);
128c81ca2caSespie	$lofile->write($outfile);
129c81ca2caSespie}
130c81ca2caSespie
131c81ca2caSespie1;
132