#!/usr/bin/perl -w # Copyright (C) 2003 Ximian, Inc. # Paolo Molaro (lupus@ximian.com) # # Create an header file to be included in the mono libraries to # bundle assemblies inside the runtime. # The template file contains a list of assemblies, one per line, # with the name followed by a ':' and the filename. # Lines starting with '#' and empty lines are ignored. # See sample-bundle for an example. # We need to use an assembly file because gcc can't handle large arrays:-( if ($#ARGV != 2) { die "Usage: make-bundle.pl template headerfile.h asm-file\n"; } my $template = $ARGV [0]; my $header = $ARGV [1]; my $output = $ARGV [2]; my %assemblies = (); my $line = 0; open (T, $template) || die "Cannot open bundle template: $!\n"; while () { ++$line; next if (/^\s*#/); next if (/^\s*$/); if (/^([a-zA-Z0-9-.]+):\s*(.+?)\s*$/) { my ($name, $filename) = ($1, $2); if (exists $assemblies {$name}) { die "Assembly $name defined multiple times.\n"; } else { $assemblies {$name} = $filename; } } else { die "Unknown format at line $line: $_"; } } close (T); open (O, ">$output.tmp") || die "Cannot open $output: $!\n"; open (H, ">$header.tmp") || die "Cannot open $output: $!\n"; print H <<"EOF"; /* File generated by make-bundle: do not edit! */ #ifndef __MONO_BUNDLE_H__ #define __MONO_BUNDLE_H__ typedef struct { const char *name; const unsigned char *data; const unsigned int size; } MonoBundledAssembly; EOF my $bundle_entries = ""; foreach my $name (sort keys %assemblies) { my $file = $assemblies {$name}; my ($nread, $buf, $i, $cname, $need_eol, $size); $cname = $name; $cname =~ s/[-.]/_/g; open (F, $file) || die "Cannot open $file: $!\n"; $size = -s F; # print O "/* assembly $name from $file */\n"; # print O "static const unsigned char assembly_data_$cname [] = {\n"; print O ".globl assembly_data_$cname\n"; print O "\t.section .rodata\n"; print O "\t.align 32\n"; print O "\t.type assembly_data_$cname, \@object\n"; print O "\t.size assembly_data_$cname, $size\n"; print O "assembly_data_$cname:\n"; print H "extern const unsigned char assembly_data_$cname [];\n"; print H "static const MonoBundledAssembly assembly_bundle_$cname = {\"$name\", assembly_data_$cname, $size};\n"; $bundle_entries .= "\t&assembly_bundle_$cname,\n"; $need_eol = 0; print "Adding assembly '$name' from $file...\n"; while (($n = sysread (F, $buf, 32))) { for ($i = 0; $i < $n; ++$i) { print O "\t.byte ", ord (substr ($buf, $i, 1)), "\n"; } # print O ",\n" if ($need_eol); # $need_eol = 1; # print O "\t"; # for ($i = 0; $i < $n; ++$i) { # print O ", " if $i > 0; # print O ord (substr ($buf, $i, 1)); # } } # print O "\n};\n\n"; close (F); } print H "\nstatic const MonoBundledAssembly* bundled_assemblies [] = {\n"; print H $bundle_entries; print H "\tNULL\n"; print H "};\n\n"; print H "#endif /* __MONO_BUNDLE_H__ */\n"; close (O); close (H); rename ("$header.tmp", $header); rename ("$output.tmp", $output);