3 # meta script to run everything at once.
5 # TODO: add an option that dumps out the make dependencies
9 use File::Spec::Functions qw(abs2rel);
12 use lib "$FindBin::Bin/../lib";
15 use File::Path qw(make_path);
23 my $mode = 'generate';
33 my $cmd = shift(@ARGV);
36 $var->{'make-target'} = shift;
37 } elsif ($cmd eq '-MF') {
38 $var->{'make-file'} = shift;
40 if ($cmd =~ m/^(-[^-])(.+)/) {
46 $var->{package} = shift;
47 } elsif ($cmd eq "-d") {
48 $var->{output} = shift;
49 } elsif ($cmd eq "-w") {
50 $var->{workdir} = shift;
51 } elsif ($cmd eq "-I") {
52 push @{$var->{include}}, shift;
53 } elsif ($cmd eq "-v") {
55 } elsif ($cmd eq '-M') {
59 $apih = "$1.h" if ($apidef =~ m/^(.*).api$/);
60 $apibase = basename($apidef, '.api');
65 push @{$var->{include}}, "$FindBin::Bin/../lib";
69 die ("Missing config argument") if !defined($apidef);
70 die ("Unable to find config: $apidef") if !-f $apidef;
71 die ("Unable to find matching header for: $apidef") if !-f $apih;
73 my $api = new config($var, $apidef);
74 my @includes = map { ('-I', $_ ) } @{$var->{include}};
76 if ($mode eq 'make-rule') {
79 $var->{'make-target'} = "$apibase.d" if !defined $var->{'make-target'};
83 '-MT', $var->{'make-target'},
87 open (my $gcc, '-|', 'gcc', @args) // die("command failed $!");
96 foreach my $m (qw(export-api export-defines generate-api)) {
97 push @list, abs2rel("$FindBin::Bin/$m");
99 foreach my $m (qw(api.pm code.pm config.pm method.pm tokenise.pm)) {
100 push @list, abs2rel("$FindBin::Bin/../lib/$m");
104 push @list, map { abs2rel($_) } @{$api->{includes}};
106 if (defined $var->{'make-file'}) {
107 open (my $f, ">", $var->{'make-file'}.'~') || die "writing $var->{'make-file'}";
108 print $f join(" \\\n ", @list)."\n";
109 close ($f) || die "writing $var->{'make-file'}";
110 rename($var->{'make-file'}.'~', $var->{'make-file'}) || die "writing $var->{'make-file'}";
112 print join(" \\\n ", @list)."\n";
119 "-fplugin=$FindBin::Bin/../lib/libexport.so",
120 "-fplugin-arg-libexport-output=$var->{workdir}/$apibase.pm",
121 # "-fplugin-arg-libexport-verbose=$var->{verbose}",
128 print join " ", @cmd, "\n";
129 system(@cmd) == 0 || die("command failed");
132 if (grep { $_->{type} eq 'define' } @{$api->{objects}}) {
134 "$FindBin::Bin/export-defines",
135 '--hack-new-format-2',
136 $var->{verbose} ? '-v' : (),
138 "$var->{workdir}/$apibase-defines.pm",
143 print join " ", @cmd, "\n";
144 system(@cmd) == 0 || die("command failed");
145 push @defines, '-a', "./$var->{workdir}/$apibase-defines.pm";
149 "$FindBin::Bin/generate-api",
150 $var->{verbose} ? '-v' : (),
151 '-t', $var->{package},
152 '-d', $var->{output},
153 '-a', "./$var->{workdir}/$apibase.pm",
157 print join " ", @cmd, "\n";
158 system(@cmd) == 0 || die("command failed");