NetBSD/usr.bin/file/file2netbsd
2001-03-17 11:32:15 +00:00

356 lines
8.3 KiB
Perl

#!/usr/pkg/bin/perl
#
# $NetBSD: file2netbsd,v 1.8 2001/03/17 11:32:15 pooka Exp $
#
# Perl script to convert a standard distribution directory for file into
# a NetBSD source tree.
#
# This is done as a script so that as each distribution is released,
# only changes from the previous one need to be dealt with as
# modifications to this script and related files. This should
# reduce the cost of updating from a new release of xntp by an
# order of magnitude (or more?)
#
# This script requires two environment variables set:
# SRCDIR - file source directory
# TARGETDIR - name of the high level directory to make
#
# Written by Christos Zoulas July 17, 1997 for file-3.26
#
$version = "3.34";
# definitions ...
@subdirs = ("usr.bin/file", "usr.bin/file/magdir");
@filef = ("LEGAL.NOTICE", "MAINT", "magic.mime",
"README", "apprentice.c", "ascmagic.c",
"compress.c", "file.c", "file.h", "fsmagic.c",
"is_tar.c", "names.h", "patchlevel.h",
"print.c", "readelf.c", "readelf.h", "softmagic.c", "tar.h");
#
# Utility Subroutines
#
sub makedir {
system("mkdir -p @_");
}
# &fixrcs (fromfile, tofile);
sub fixrcs
{
my ($f, $t) = @_;
my @keywords = ("Author", "Date", "Header", "Id", "Locker", "Log",
"Name", "RCSfile", "Revision", "Source", "State");
my %mansubst = ('__CSECTION__', '1',
'__FSECTION__', '5',
'__VERSION__', $version,
'__MAGIC__', '/usr/share/misc/magic');
my $state = 0;
my $hdr = 0;
open(IFILE, "<$f") || die "Cannot open $f";
open(OFILE, ">$t") || die "Cannot create $t";
if ($t =~ /.*\.[0-9]/) {
print OFILE '.\\" $', 'NetBSD', '$', "\n", '.\\"', "\n";
}
elsif ($t =~ /.*\.[ch]/) {
print OFILE "/*\t", '$', 'NetBSD', '$', "\t*/\n\n";
}
elsif ($t =~ /.*\.[yl]/) {
$hdr = 1;
}
else {
print OFILE '$', 'NetBSD', '$', "\n";
}
while (<IFILE>) {
if ($hdr == 1) {
if (/%{/) {
print OFILE "%{\n/*\t", '$', 'NetBSD', '$', "\t*/\n\n";
$hdr = 0;
next;
}
}
if ($state == 2) {
if (/#endif/) {
print OFILE "#else\n__RCSID(", '"$', 'NetBSD', '$"',
");\n#endif\n";
$state = 0;
}
}
if ($state == 1) {
print OFILE "#if 0\n";
$state = 2;
}
if (/#ifndef lint/) {
print OFILE "#include <sys/cdefs.h>\n";
$state = 1;
}
foreach $key (@keywords) {
s/\$$key\$/$key/g;
s/\$$key:(.*)\$/$key:$1/g;
}
while (($from, $to) = each %mansubst) {
s/$from/$to/g;
}
print OFILE $_;
}
close(IFILE) || die "closing input file";
close(OFILE) || die "closing output file";
}
# &copyfiles (fromdir, todir, list of files);
sub copyfiles {
local ($fdir, $tdir, @list) = @_;
local ($f);
foreach $f (@list) {
print " $fdir/$f --> $tdir/$f\n";
&fixrcs("$fdir/$f", "$tdir/$f");
}
}
# &copyfile (fromfile, tofile);
sub copyfile {
local ($f, $t) = @_;
print " $f --> $t\n";
&fixrcs("$f", "$t");
}
sub uniq {
local (@inlist) = @_;
local (@outlist);
@outlist = ($inlist[0]);
for ( $i=1; $i < @inlist; $i++ ) {
if ($inlist[$i] ne $inlist[$i-1]) {
push (@outlist, $inlist[$i]);
}
}
@outlist;
}
sub dumpsrcs {
local (@names) = @_;
local ($count);
print ODATA "SRCS=\t";
$count = 0;
while ($f = pop(@names)) {
print ODATA "$f ";
if ($count == 5 && @names > 0) {
print ODATA "\\\n";
$count = 0;
} else {
$count += 1;
}
}
if ($count != 0) {
print ODATA "\n";
}
}
#
# Main progarm.
#
$srcdir = $ENV{'SRCDIR'};
$targetdir = $ENV{'TARGETDIR'};
$incdirs = "-I. -I$srcdir/config -I$srcdir";
if (!$srcdir | !targetdir) {
die "You must define the environment variables SRCDIR and TARGETDIR.\n"
}
print "Making the NetBSD directory tree.\n";
foreach $f (@subdirs) {
print " -->$f\n";
makedir ("$targetdir/$f");
}
print "Populating the usr.bin/file directory.\n";
&copyfiles ("$srcdir", "$targetdir/usr.bin/file", @filef);
&copyfile("$srcdir/file.man", "$targetdir/usr.bin/file/file.1");
&copyfile("$srcdir/magic.man", "$targetdir/usr.bin/file/magic.5");
system("cat $srcdir/Header > $targetdir/usr.bin/file/Header");
system("cat $srcdir/Localstuff > $targetdir/usr.bin/file/Localstuff");
print "Populating the usr.bin/file/magdir directory.\n";
system("cp -rp $srcdir/Magdir/* $targetdir/usr.bin/file/magdir; chmod -R ug+w $targetdir/usr.bin/file/magdir");
#
# Build makefiles
#
$first = "True";
while ($line = <DATA>) {
chop ($line);
if (substr($line,0,2) eq "%%") {
@cmd = split (/ /,$line);
if ($cmd[1] eq "file") {
print "Building $targetdir/$cmd[2]\n";
if ($first eq "") {
close (ODATA);
} else {
$first = "";
}
open (ODATA, ">$targetdir/$cmd[2]") ||
die "Could not create $targetdir/$cmd[2]";
} elsif ($cmd[1] eq "srcs") {
print " Defining SRCS for $cmd[2]\n";
if ($first) {
die "Data file must start with a %% file!";
}
} elsif ($cmd[1] eq "NetBSD") {
if ($first) {
die "Data section must start with a %% file!";
}
print ODATA "$cmd[2] \$"."NetBSD".": \$\n";
}
} else {
if ($first) {
die "Data file must start with a %% file!";
}
print ODATA "$line\n";
}
}
close (ODATA);
#
# Sed transformations of files
#
foreach $n (keys(%sedlist)) {
print "Modifying $n\n";
system ("cd $targetdir; sed $sedlist{$n} $n > tmp; mv -f tmp $n");
}
#
# end of the script
#
# what follows is the data for makefiles and other special files
# that need to be created.
__END__
%% file usr.bin/file/Makefile
%% NetBSD #
.include <bsd.own.mk>
MFILESDIR= /usr/share/misc
MFILES= magic magic.mime
MAGIC= ${MFILESDIR}/magic
.if ${MKSHARE} != "no"
FILESDIR= ${MFILESDIR}
FILES= ${MFILES}
.endif
PROG= file
SRCS= file.c apprentice.c fsmagic.c softmagic.c ascmagic.c is_tar.c \
print.c compress.c readelf.c
CPPFLAGS+= -DMAGIC='"$(MAGIC)"' -DHAVE_CONFIG_H -I${.CURDIR}
CPPFLAGS+= -DBUILTIN_ELF -DELFCORE
MAN= file.1 magic.5
CLEANFILES+= magic
all: file magic
MAGDIRF:sh= echo $(.CURDIR)/magdir/[0-9a-z]*
MAGFILES= $(.CURDIR)/Header \
$(.CURDIR)/Localstuff \
$(.CURDIR)/magdir/netbsd \
${MAGDIRF}
.if ${MKSHARE} != "no"
magic: $(MAGFILES)
cat $(MAGFILES) > $(.TARGET)
.else
magic:
.endif
.include <bsd.prog.mk>
%% file usr.bin/file/config.h
/* config.h. Generated automatically by configure. */
/* config.h.in. Generated automatically from configure.in by autoheader. */
/* Define to empty if the keyword does not work. */
/* #undef const */
/* Define if your struct stat has st_rdev. */
#define HAVE_ST_RDEV 1
/* Define if you have <sys/wait.h> that is POSIX.1 compatible. */
#define HAVE_SYS_WAIT_H 1
/* Define if major, minor, and makedev are declared in <mkdev.h>. */
/* #undef MAJOR_IN_MKDEV */
/* Define if major, minor, and makedev are declared in <sysmacros.h>. */
/* #undef MAJOR_IN_SYSMACROS */
/* Define to `long' if <sys/types.h> doesn't define. */
/* #undef off_t */
/* Define to `unsigned' if <sys/types.h> doesn't define. */
/* #undef size_t */
/* Define if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Define if builtin ELF support is enabled. */
#define BUILTIN_ELF 1
/* Define if ELF core file support is enabled. */
#define ELFCORE 1
/* Define if the `long long' type works. */
#define HAVE_LONG_LONG 1
/* Define to `unsigned char' if standard headers don't define. */
#define uint8_t unsigned char
/* Define to `unsigned short' if standard headers don't define. */
#define uint16_t unsigned short
/* Define to `unsigned int' if standard headers don't define. */
#define uint32_t unsigned int
/* Define to `unsigned long long', if available, or `unsigned long', if
standard headers don't define. */
#define uint64_t unsigned long long
/* The number of bytes in a uint8_t. */
#define SIZEOF_UINT8_T 1
/* The number of bytes in a uint16_t. */
#define SIZEOF_UINT16_T 2
/* The number of bytes in a uint32_t. */
#define SIZEOF_UINT32_T 4
/* The number of bytes in a uint64_t. */
#define SIZEOF_UINT64_T 8
/* Define if you have the strerror function. */
#define HAVE_STRERROR 1
/* Define if you have the strtoul function. */
#define HAVE_STRTOUL 1
/* Define if you have the <locale.h> header file. */
#define HAVE_LOCALE_H 1
/* Define if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Name of package */
#define PACKAGE "file"
/* Version number of package */
#define VERSION "3.34"