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