Files
epics-base/src/tools/mkmf.pl
Andrew Johnson 3c99391d93 Added SPDX License ID to all EPICS-original source files
In some cases the license-identification header was missing,
so I added that as well. Replaced the remaining headers that
specifically identified "Versions 3.13.7 and higher".

Makefiles and the build system were deliberately excluded.
2020-08-03 11:53:01 -05:00

153 lines
4.2 KiB
Perl

#!/usr/bin/env perl
#*************************************************************************
# Copyright (c) 2009 Helmholtz-Zentrum Berlin fuer Materialien und Energie.
# Copyright (c) 2012 UChicago Argonne LLC, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# SPDX-License-Identifier: EPICS
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
#-----------------------------------------------------------------------
# mkmf.pl: Perl script to create #include file dependencies
#
# Limitations:
#
# 1) Only handles the #include preprocessor command. Does not understand
# the preproceeor commands #define, #if, #ifdef, #ifndef, ...
# 2) Does not know a compilers internal macro definitions e.g.
# __cplusplus, __STDC__, __GNUC__
# 3) Does not keep track of the macros defined in #include files so can't
# do #ifdefs #ifndef ...
# 4) Does not know where system include files are located
# 5) Accepts #include lines with single, double or angle-quoted file names
# 6) Accepts -Mxxx options for compatibility with msi, but ignores them
#
#-----------------------------------------------------------------------
use strict;
use FindBin;
use lib "$FindBin::Bin/../../lib/perl";
use EPICS::Getopts;
my $tool = 'mkmf.pl';
my $endline = $/;
my %output;
my @includes;
our ( $opt_d, $opt_m, @opt_I, @opt_M);
getopts( 'dm:I@M@' ) ||
die "\aSyntax: $0 [-d] [-m dependsFile] [-I incdir] objFile srcFile [srcfile]... \n";
my $debug = $opt_d;
my $depFile = $opt_m;
my @incdirs = @opt_I;
my $objFile = shift or die "No target file argument";
my @srcFiles=@ARGV;
if( $debug ) {
print "$0 $tool\n";
print "DEBUG: incdirs= @incdirs\n";
print "DEBUG: objFile= $objFile\n";
print "DEBUG: srcFiles= @srcFiles\n";
}
print "Generating dependencies for $objFile\n" if $debug;
foreach my $srcFile (@srcFiles) {
scanFile($srcFile);
scanIncludesList();
}
$depFile = 'depends' unless $depFile;
print "Creating file $depFile\n" if $debug;
printList($depFile,$objFile);
print "\n ALL DONE \n\n" if $debug;
#----------------------------------------
sub printList{
my $depFile = shift;
my $objFile = shift;
my $file;
unlink($depFile) or die "Can't delete $depFile: $!\n" if -f $depFile;
open DEPENDS, ">$depFile" or die "\aERROR opening file $depFile for writing: $!\n";
my $old_handle = select(DEPENDS);
print "# DO NOT EDIT: This file created by $tool\n\n";
foreach $file (@includes) {
print "$objFile : $file\n";
}
print "\n\n";
select($old_handle) ; # in this case, STDOUT
}
#-------------------------------------------
# scan file for #includes
sub scanFile {
my $file = shift;
my $incfile;
my $line;
print "Scanning file $file\n" if $debug;
open FILE, $file or return;
foreach $line ( <FILE> ) {
$incfile = findNextIncName($line,$file=~/\.substitutions$/);
next if !$incfile;
next if $output{$incfile};
push @includes,$incfile;
$output{$incfile} = 1;
}
close FILE;
}
#------------------------------------------
# scan files in includes list
sub scanIncludesList {
my $file;
foreach $file (@includes) {
scanFile($file);
}
}
#-----------------------------------------
# find filename on #include and file lines
sub findNextIncName {
my $line = shift;
my $is_subst = shift;
my $incname = "";
my $incfile = 0;
my $dir;
local $/ = $endline;
if ($is_subst) {
return 0 if not $line =~ /^\s*file\s*([^\s{]*)/;
$incname = $1;
$incname = substr $incname, 1, length($incname)-2 if $incname =~ /^".+?"$/;
} else {
return 0 if not $line =~ /^#?\s*include\s*('.*?'|<.*?>|".*?")/;
$incname = substr $1, 1, length($1)-2;
}
print "DEBUG: $incname\n" if $debug;
return $incname if -f $incname;
return 0 if ( $incname =~ /^\// || $incname =~ /^\\/ );
foreach $dir ( @incdirs ) {
chomp($dir);
$incfile = "$dir/$incname";
print "DEBUG: checking for $incname in $dir\n" if $debug;
return $incfile if -f $incfile;
}
return 0;
}