summaryrefslogtreecommitdiff
path: root/v4l/scripts
diff options
context:
space:
mode:
authorTrent Piepho <xyzzy@speakeasy.org>2006-08-31 16:42:12 -0700
committerTrent Piepho <xyzzy@speakeasy.org>2006-08-31 16:42:12 -0700
commit529dc5a3d5c603f87061f8e44cd2947b10e27af0 (patch)
tree234987e9f7382f8f3538f607571934861466f0f6 /v4l/scripts
parentae00b25c2d3cb4ccca19d197bba285ebca7896a5 (diff)
downloadmediapointer-dvb-s2-529dc5a3d5c603f87061f8e44cd2947b10e27af0.tar.gz
mediapointer-dvb-s2-529dc5a3d5c603f87061f8e44cd2947b10e27af0.tar.bz2
Re-write make_makefile.pl, re-work v4l/Makefile
From: Trent Piepho <xyzzy@speakeasy.org> The make_makefile.pl script is re-written. The old one was nasty. This one will correctly handle Makefile lines that are continued with a backslash. It will also generate a dependency list of the Makefile used to create Makefile.media. This way if any change, Makefile.media will be automatically re-made by make. The whole business where make_makefile.pl would call make_kconfig.pl is removed. The underlying logic of the main Makefile is completely changed. Make has a feature where it will make sure any included files are up-to-date, and then restart itself if any were updated. We now take advantage of this feature. Detect when make is building only targets which do not need include files like .myconfig or Makefile.media, and don't include them in those cases. Signed-off-by: Trent Piepho <xyzzy@speakeasy.org>
Diffstat (limited to 'v4l/scripts')
-rwxr-xr-xv4l/scripts/make_makefile.pl257
1 files changed, 115 insertions, 142 deletions
diff --git a/v4l/scripts/make_makefile.pl b/v4l/scripts/make_makefile.pl
index e0a099e9b..f49edb0f8 100755
--- a/v4l/scripts/make_makefile.pl
+++ b/v4l/scripts/make_makefile.pl
@@ -1,186 +1,159 @@
#!/usr/bin/perl
use FileHandle;
-my $kernel=shift;
-my $instdir = ();
-
+my %instdir = ();
+
+# Take a Makefile line of the form:
+# obj-XXXXX = some_directory/ some_module.o
+#
+# All directories are processed by including the referenced Makefile and
+# removing the directory. The modules are added to the list of modules
+# to install. Prints the edited line to OUT.
+# Arguments: directory Makefile is in, the objects, original line(s) from
+# Makefile (with newlines intact).
sub check_line($$$)
{
- my $dir=shift;
- my $obj=shift;
- my $arg=shift;
- my $arg2="";
-
- my $idir = $dir;
-
- $idir =~ s|^../linux/drivers/media/||;
-
- $arg=$arg." ";
-
- while ($arg ne "") {
- if ($arg =~ m|^([^ /]+)/ |) {
- my $newdir=$1;
-# print "include $dir/$newdir/Makefile\n";
- open_makefile("$dir/$newdir/Makefile");
- $arg =~ s/^[^ ]+ //;
- } else {
- $arg =~ s/^([^ ]+ )//;
- my $cur=$1;
- $arg2 = $arg2.$cur;
-
- $cur =~ s/\s+$//;
- $cur =~ s/\\$//;
- $cur =~ s/\s+$//;
- $cur =~ s/\.o$/.ko/;
-
- if ( ($cur ne "") && (! ($instdir { $idir } =~ m/($cur) /))) {
- $instdir { $idir } = $instdir { $idir }.$cur." ";
- }
+ my $dir = shift;
+ my $objs = shift;
+ my $orig = shift;
+ my $count = 0;
+
+ foreach(split /\s+/, $objs) {
+ if (m|/$|) { # Ends in /, means it's a directory
+ # Delete this directory from original Makefile line
+ $orig =~ s/$_[ \t]*//;
+ $_ .= 'Makefile';
+ # print STDERR "open new makefile $dir/$_\n";
+ open_makefile("$dir/$_");
+ next;
}
+
+ # It's a file, add it to list of files to install
+ s/\.o$/.ko/;
+ my $idir = $dir;
+ $idir =~ s|^../linux/drivers/media/||;
+ $instdir{$idir}{$_} = 1;
+ $count++;
}
- $arg2 =~ s/\s+$//;
- if ($arg2 ne "") {
-# print "arg=$arg2\n";
- print OUT "$obj$arg2\n";
- }
+ # Removing any tailling whitespace, just to be neat
+ $orig =~ s/[ \t]+$//mg;
+
+ # Print out original line, less directories, if there is anything
+ # still there
+ print OUT $orig if($count);
}
+# Uses the string being assigned from a line of the form:
+# EXTRA_CFLAGS += -Idrivers/media/something -Dwhatever
+#
+# All the -Idrivers/media/something options get deleted. All the source
+# files are linked into the v4l directory and built from there, so and -I
+# option for them is unnecessary. The line is printed to OUT if there is
+# anything left after that.
sub remove_includes($$)
{
- my $obj=shift;
- my $arg=shift;
- my $arg2="";
-
- $arg=$arg." ";
-
- while ($arg ne "") {
- if (!$arg =~ m|^(-I\s*[^ ]+) |) {
- $arg2 = $arg2.$1;
- $arg =~ s|^[^ ] ||;
- } else {
- $arg =~ s|^(-I\s*[^ ]+) ||;
+ my $flags = shift;
+ my $orig = shift;
+ my $count = 0;
+
+ foreach(split /\s+/, $flags) {
+ if (m|^-Idrivers/media|) {
+ # Remove any -I flags from original Makefile line
+ $orig =~ s/$_[ \t]*//;
+ next;
}
+ $count++; # Something wasn't deleted
}
- if ($arg2 ne "") {
- print OUT "$obj$arg2\n";
- }
+ $orig =~ s/[ \t]+$//mg;
+
+ # Print out original line if there is anything we didn't delete
+ print OUT $orig if($count);
}
sub open_makefile($) {
- my $file= shift;
+ my $file = shift;
my $in = new FileHandle;
- my $dir= "";
- my $count=0;
+ my $orig;
- $file=~ m|^(.*)/[^/]*$|;
- $dir=$1;
+ $file =~ m|^(.*)/[^/]*$|;
+ my $dir = $1;
-#print "opening $file (dir=$dir)\n";
- open $in,"$file";
+ # print STDERR "opening $file (dir=$dir)\n";
+ open $in, $file;
while (<$in>) {
- if (m|\s*#|) {
+ # print STDERR "Line: $_";
+ # Skip comment lines
+ if (/^\s*#/) {
print OUT $_;
next;
}
- if (m|^\s*include|) {
- next;
+ m/^\s*-?include/ and die "Can't handle includes! In $file";
+
+ # Handle line continuations
+ if (/\\\n$/) {
+ $_ .= <$in>;
+ redo;
}
- if (count==1 || m|(^\s*EXTRA_CFLAGS.*=\s*)(.*/.*)\n|) {
- remove_includes($1,$2);
- if (m|[\\]\n|) {
- $count=1;
- } else {
- $count=0;
- }
+
+ # $orig is what we will print, $_ is what we will parse
+ $orig = $_;
+ # Eat line continuations in string we will parse
+ s/\s*\\\n\s*/ /g;
+ # Eat comments
+ s/#.*$//;
+
+ if (/^\s*obj-.*:?=\s*(\S.*?)\s*$/) {
+ # print STDERR "obj matched '$1'\n";
+ check_line($dir, $1, $orig); # will print line for us
next;
}
-# if (m|(^\s*obj.*=\s*)(.*/.*)\n|) {
- if (count==2 || m|(^\s*obj.*=\s*)(.*)\n|) {
- check_line($dir,$1,$2);
- if (m|\\\n|) {
- $count=1;
- } else {
- $count=0;
- }
+ if (/^\s*EXTRA_CFLAGS\s+\+?=\s*(\S.*?)\s*$/) {
+ # print STDERR "cflags matched '$1'\n";
+ remove_includes($1, $orig); # will print line for us
next;
}
- print OUT $_;
+ print OUT $orig;
}
close $in;
}
-open OUT,">Makefile.media.new";
-open_makefile ("../linux/drivers/media/Makefile");
+open OUT, '>Makefile.media' or die 'Unable to write Makefile.media';
+open_makefile('../linux/drivers/media/Makefile');
# Creating Install rule
-printf OUT "media-install::\n";
-printf OUT "\t\@echo \"Stripping debug info from files:\"\n";
-printf OUT "\t\@strip --strip-debug \$(inst-m)\n\n";
-
-while ( my ($key, $value) = each(%instdir) ) {
- printf OUT "\t\@echo -e \"\\nInstalling \$(KDIR26)/$key files:\"\n";
- printf OUT "\t\@install -d \$(KDIR26)/$key\n";
-
- printf OUT "\t\@files='$value'; ";
- printf OUT "for i in \$\$files;do if [ -e \$\$i ]; then echo -n \"\$\$i \";";
- printf OUT " install -m 644 -c \$\$i \$(KDIR26)/$key; fi; done; echo;\n\n";
+print OUT "media-install::\n";
+print OUT "\t\@echo \"Stripping debug info from files:\"\n";
+print OUT "\t\@strip --strip-debug \$(inst-m)\n\n";
+
+while (my ($dir, $files) = each %instdir) {
+ print OUT "\t\@echo -e \"\\nInstalling \$(KDIR26)/$dir files:\"\n";
+ print OUT "\t\@install -d \$(KDIR26)/$dir\n";
+ print OUT "\t\@for i in ", join(' ', keys %$files), ";do ";
+ print OUT "if [ -e \"\$\$i\" ]; then echo -n \"\$\$i \";";
+ print OUT " install -m 644 -c \$\$i \$(KDIR26)/$dir; fi; done; echo;\n\n";
}
-printf OUT "\t/sbin/depmod -a \${KERNELRELEASE}\n\n";
+print OUT "\t/sbin/depmod -a \${KERNELRELEASE}\n\n";
# Creating Remove rule
-printf OUT "media-rminstall::\n";
-printf OUT "\t\@echo -e \"\\nRemoving old \$(DEST) files\\n\"\n";
+print OUT "media-rminstall::\n";
+print OUT "\t\@echo -e \"\\nRemoving old \$(DEST) files\\n\"\n";
-while ( my ($key, $value) = each(%instdir) ) {
- printf OUT "\t\@echo -e \"\\nRemoving old \$(KDIR26)/$key files:\"\n";
- printf OUT "\t\@files='$value'; ";
+while ( my ($dir, $files) = each(%instdir) ) {
+ print OUT "\t\@echo -e \"\\nRemoving old \$(KDIR26)/$dir files:\"\n";
+ print OUT "\t\@files='", join(' ', keys %$files), "'; ";
- printf OUT "for i in \$\$files;do if [ -e \$(KDIR26)/$key/\$\$i ]; then ";
- printf OUT "echo -n \"\$\$i \";";
- printf OUT " rm \$(KDIR26)/$key/\$\$i; fi; done; ";
+ print OUT "for i in \$\$files;do if [ -e \$(KDIR26)/$dir/\$\$i ]; then ";
+ print OUT "echo -n \"\$\$i \";";
+ print OUT " rm \$(KDIR26)/$dir/\$\$i; fi; done; ";
- printf OUT "for i in \$\$files;do if [ -e \$(KDIR26)/$key/\$\$i.gz ]; then ";
- printf OUT "echo -n \"\$\$i.gz \";";
- printf OUT " rm \$(KDIR26)/$key/\$\$i.gz; fi; done; echo;\n\n";
+ print OUT "for i in \$\$files;do if [ -e \$(KDIR26)/$dir/\$\$i.gz ]; then ";
+ print OUT "echo -n \"\$\$i.gz \";";
+ print OUT " rm \$(KDIR26)/$dir/\$\$i.gz; fi; done; echo;\n\n";
}
+# Print dependencies of Makefile.media
+print OUT "Makefile.media: ../linux/drivers/media/Makefile \\\n";
+print OUT join(" \\\n", map("\t../linux/drivers/media/$_/Makefile", keys %instdir));
+print OUT "\n";
close OUT;
-
-while ( my ($key, $value) = each(%config) ) {
- delete $depend{$key};
-}
-
-open OUT,">Kconfig.kern";
-while ( my ($key, $value) = each(%depend) ) {
- print OUT "# $key with $value refs\nconfig $key\n\ttristate\n\tdefault m\n\n";
-}
-close OUT;
-
-if (open IN,"Makefile.media") {
- close IN;
- my $changed=0;
- if (open IN,"diff Makefile.media Makefile.media.new|") {
- while (<IN>) {
- if ($_ ne "") {
- $changed=1;
- }
- }
- close IN;
- if ($changed) {
- printf("One or more linux Makefiles had changed. Makefile.media rewrited.\n");
- system ("mv Makefile.media.new Makefile.media");
- } else {
- system ("rm Makefile.media.new");
- }
- }
-} else {
- printf("Creating Makefile.media.\n");
- system "mv Makefile.media.new Makefile.media";
-}
-
-if (open IN,".myconfig") {
- close IN;
-} else {
- system "./scripts/make_kconfig.pl $kernel 1";
-}