diff options
author | Trent Piepho <xyzzy@speakeasy.org> | 2006-08-31 16:42:12 -0700 |
---|---|---|
committer | Trent Piepho <xyzzy@speakeasy.org> | 2006-08-31 16:42:12 -0700 |
commit | 529dc5a3d5c603f87061f8e44cd2947b10e27af0 (patch) | |
tree | 234987e9f7382f8f3538f607571934861466f0f6 | |
parent | ae00b25c2d3cb4ccca19d197bba285ebca7896a5 (diff) | |
download | mediapointer-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>
-rw-r--r-- | v4l/Makefile | 54 | ||||
-rwxr-xr-x | v4l/scripts/make_makefile.pl | 257 |
2 files changed, 162 insertions, 149 deletions
diff --git a/v4l/Makefile b/v4l/Makefile index cd3c8312c..6afa117e2 100644 --- a/v4l/Makefile +++ b/v4l/Makefile @@ -37,12 +37,49 @@ default:: config-compat.h Makefile.media links .version ################################################# # Object specific rules --include $(obj)/.kconfig.dep +# Targets which don't need Makefile.media's rules +no-makefile-media-targets := %config clean distclean release snapshot snap \ + tarball release %links start insmod load stop rmmod unload reload \ + card% update push %commit help debug ivtv% cx88-ivtv lxdialog + +# Targets which don't need .myconfig to exist, to keep us from including it +no-dot-config-targets := $(no-makefile-media-targets) %install remove + +dot-config := 1 +ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),) + ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),) + dot-config := 0 + endif +endif + +makefile-media := 1 +ifneq ($(filter $(no-makefile-media-targets), $(MAKECMDGOALS)),) + ifeq ($(filter-out $(no-makefile-media-targets), $(MAKECMDGOALS)),) + makefile-media := 0 + endif +endif + +ifeq ($(dot-config),1) -include $(obj)/.myconfig +endif + +ifeq ($(makefile-media),1) -include $(obj)/Makefile.media -include $(obj)/Makefile.sound +endif + +-include $(obj)/.kconfig.dep -include $(obj)/Makefile.ivtv +# make will try to automatically rebuild the Makefile and all includes, +# and if any of them change, make will start over with the updated files + +# If it doesn't exist, this rule will build Makefile.media. If it does +# exist, it will have dependency information in it, and only be rebuilt +# when necessary. +Makefile.media: + scripts/make_makefile.pl + ################################################# # CFLAGS configuration @@ -132,7 +169,7 @@ export LC_ALL ################################################# # all file compilation rule -all:: allmodconfig default +all:: default ################################################# # installation invocation rules @@ -155,9 +192,6 @@ else @uname -r|perl -ne 'if (/^([0-9]*)\.([0-9])*\.([0-9]*)(.*)$$/) { printf ("VERSION=%s\nPATCHLEVEL:=%s\nSUBLEVEL:=%s\nKERNELRELEASE:=%s.%s.%s%s\n",$$1,$$2,$$3,$$1,$$2,$$3,$$4); };' > $(obj)/.version endif -Makefile.media:: .version - scripts/make_makefile.pl $(KDIR) - release:: ifneq ($(VER),) @echo "Forcing compiling to version $(VER)." @@ -263,6 +297,13 @@ LXDIALOG_DIR := $(shell if [ -d $(KDIR)/scripts/kconfig/lxdialog ]; then echo kc LXDIALOG_LNK := $(if $(LXDIALOG_DIR),scripts/kconfig,scripts/lxdialog) LXDIALOG := $(KDIR)/scripts/$(LXDIALOG_DIR)lxdialog/lxdialog +# Rule to make a .config if one doesn't exist +# Ideally, some kind of oldconfig process would be used +.config: .version + @echo "Creating default .config file" + ./scripts/make_kconfig.pl $(KDIR) + @touch .config + .myconfig: .config Kconfig ./scripts/make_myconfig.pl @@ -281,8 +322,7 @@ config:: links $(CONF) Kconfig menuconfig:: links $(MCONF) lxdialog Kconfig $(MCONF) Kconfig -allyesconfig allmodconfig:: links .version - @echo "Creating default .config file" +allyesconfig allmodconfig:: .version ./scripts/make_kconfig.pl $(KDIR) 1 # rule to build kernel conf programs 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"; -} |