2 # Copyright (C) 2003 Ximian, Inc.
3 # Paolo Molaro (lupus@ximian.com)
5 # Create an header file to be included in the mono libraries to
6 # bundle assemblies inside the runtime.
7 # The template file contains a list of assemblies, one per line,
8 # with the name followed by a ':' and the filename.
9 # Lines starting with '#' and empty lines are ignored.
10 # See sample-bundle for an example.
11 # We need to use an assembly file because gcc can't handle large arrays:-(
14 die "Usage: make-bundle.pl template headerfile.h asm-file\n";
17 my $template = $ARGV [0];
18 my $header = $ARGV [1];
19 my $output = $ARGV [2];
23 open (T
, $template) || die "Cannot open bundle template: $!\n";
28 if (/^([a-zA-Z0-9-.]+):\s*(.+?)\s*$/) {
29 my ($name, $filename) = ($1, $2);
30 if (exists $assemblies {$name}) {
31 die "Assembly $name defined multiple times.\n";
33 $assemblies {$name} = $filename;
36 die "Unknown format at line $line: $_";
41 open (O
, ">$output.tmp") || die "Cannot open $output: $!\n";
42 open (H
, ">$header.tmp") || die "Cannot open $output: $!\n";
44 /* File generated by make-bundle: do not edit! */
46 #ifndef __MONO_BUNDLE_H__
47 #define __MONO_BUNDLE_H__
51 const unsigned char *data;
52 const unsigned int size;
53 } MonoBundledAssembly;
57 my $bundle_entries = "";
59 foreach my $name (sort keys %assemblies) {
60 my $file = $assemblies {$name};
61 my ($nread, $buf, $i, $cname, $need_eol, $size);
64 open (F
, $file) || die "Cannot open $file: $!\n";
66 # print O "/* assembly $name from $file */\n";
67 # print O "static const unsigned char assembly_data_$cname [] = {\n";
68 print O
".globl assembly_data_$cname\n";
69 print O
"\t.section .rodata\n";
70 print O
"\t.align 32\n";
71 print O
"\t.type assembly_data_$cname, \@object\n";
72 print O
"\t.size assembly_data_$cname, $size\n";
73 print O
"assembly_data_$cname:\n";
74 print H
"extern const unsigned char assembly_data_$cname [];\n";
75 print H
"static const MonoBundledAssembly assembly_bundle_$cname = {\"$name\", assembly_data_$cname, $size};\n";
76 $bundle_entries .= "\t&assembly_bundle_$cname,\n";
78 print "Adding assembly '$name' from $file...\n";
79 while (($n = sysread (F
, $buf, 32))) {
80 for ($i = 0; $i < $n; ++$i) {
81 print O
"\t.byte ", ord (substr ($buf, $i, 1)), "\n";
83 # print O ",\n" if ($need_eol);
86 # for ($i = 0; $i < $n; ++$i) {
87 # print O ", " if $i > 0;
88 # print O ord (substr ($buf, $i, 1));
95 print H
"\nstatic const MonoBundledAssembly* bundled_assemblies [] = {\n";
96 print H
$bundle_entries;
99 print H
"#endif /* __MONO_BUNDLE_H__ */\n";
102 rename ("$header.tmp", $header);
103 rename ("$output.tmp", $output);