author | kergoth <kergoth> | 2002-11-05 02:33:22 (UTC) |
---|---|---|
committer | kergoth <kergoth> | 2002-11-05 02:33:22 (UTC) |
commit | ed163d67a674b1c4ac6b7e917a509029da446dfb (patch) (side-by-side diff) | |
tree | d444f6395e82b1dd66f0ce8a413348a6f183bad3 | |
parent | 9ac6d0a443c417158e3f2acf2de0629c51b6511c (diff) | |
download | opie-ed163d67a674b1c4ac6b7e917a509029da446dfb.zip opie-ed163d67a674b1c4ac6b7e917a509029da446dfb.tar.gz opie-ed163d67a674b1c4ac6b7e917a509029da446dfb.tar.bz2 |
config.in generation to reduce maintainance headaches
-rw-r--r-- | Makefile.test | 8 | ||||
-rw-r--r-- | Rules.make | 7 | ||||
-rwxr-xr-x | scripts/makecfg.pl | 98 |
3 files changed, 111 insertions, 2 deletions
diff --git a/Makefile.test b/Makefile.test index dc0eec7..64f2f41 100644 --- a/Makefile.test +++ b/Makefile.test @@ -1,13 +1,19 @@ #!/usr/bin/make -f +# The following are config.in's which are generated, to avoid numerous manual edits when +# adding packages to the build. + +configs += config.in core/applets/config.in core/applets/restartapplet2/config.in core/apps/config.in core/config.in core/multimedia/config.in core/pim/config.in core/pim/today/plugins/config.in core/settings/config.in development/config.in inputmethods/config.in libopie/ofileselector/config.in libopie/pim/config.in libsql/config.in noncore/applets/config.in noncore/apps/config.in noncore/apps/opie-console/test/config.in noncore/comm/config.in noncore/config.in noncore/decorations/config.in noncore/games/config.in noncore/graphics/config.in noncore/multimedia/config.in noncore/net/config.in noncore/net/opietooth/config.in noncore/settings/config.in noncore/styles/config.in noncore/todayplugins/config.in noncore/tools/calc2/config.in noncore/tools/config.in noncore/unsupported/config.in noncore/unsupported/opiemail/ifaces/config.in x11/config.in x11/ipc/config.in x11/ipc/server/config.in + OPIEDIR:=$(shell pwd) TOPDIR:=$(OPIEDIR) -all : +all : $(configs) -include $(TOPDIR)/.config -include $(TOPDIR)/.depends all : $(TOPDIR)/.depends $(subdir-y) include $(TOPDIR)/Rules.make + @@ -1,40 +1,45 @@ ## targets ## -$(TOPDIR)/config.in : +$(configs) : + $(call makecfg,$@) $(TOPDIR)/.depends : $(TOPDIR)/config.in @cat $(TOPDIR)/packages | \ awk '/^#/ { next }; {print \ ".PHONY : " $$2 "\n" \ "subdir-$$(" $$1 ") += " $$2 "\n\n" \ $$2 "/Makefile : " $$2 "/" $$3 " $$(TOPDIR)/qmake/qmake\n\t" \ "$$(call makefilegen,$$@)\n\n" \ $$2 " : " $$2 "/Makefile\n\t$$(call descend,$$@)\n"}'\ > $(TOPDIR)/.depends @cat $(TOPDIR)/packages | \ $(TOPDIR)/scripts/deps.pl >> $(TOPDIR)/.depends $(TOPDIR)/qmake/qmake : $(call descend,$(TOPDIR)/qmake) $(TOPDIR)/scripts/lxdialog/lxdialog : $(call descend,$(TOPDIR)/scripts/lxdialog) $(TOPDIR)/scripts/kconfig/conf scripts/kconfig/conf: $(call descend,$(TOPDIR)/scripts/kconfig,conf) $(TOPDIR)/scripts/kconfig/mconf scripts/kconfig/mconf: $(call descend,$(TOPDIR)/scripts/kconfig,mconf) $(TOPDIR)/scripts/kconfig/qconf scripts/kconfijg/qconf: $(call descend,$(TOPDIR)/scripts/kconfig,qconf) ## general rules ## define descend $(MAKE) -C $(1) $(2) endef define makefilegen cd $(shell dirname $(1)); $(TOPDIR)/qmake/qmake $(3) -o $(shell basename $(1)) `echo $(1)|sed -e 's,/Makefile$$,,g' -e 's,.*/,,g'`.pro endef + +define makecfg + $(TOPDIR)/scripts/makecfg.pl $1 +endef diff --git a/scripts/makecfg.pl b/scripts/makecfg.pl new file mode 100755 index 0000000..20c23f5 --- a/dev/null +++ b/scripts/makecfg.pl @@ -0,0 +1,98 @@ +#!/usr/bin/perl -w +eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' +if 0; #$running_under_some_shell + +use strict; +use File::Find; + +my $packages=""; +open(FILE, "<./packages"); +while(<FILE>){$packages.=$_;} +close(FILE); + +my ($dirname,$dir,$cfg,$filename,$tagname,$name,$caps,$pre,$post,$sources,@dupecheck); +$cfg = shift || die; +($dirname=$cfg)=~s,(.*)/(.*),$1,; +($filename=$cfg)=~s,(.*/)(.*),$2,; +($tagname=$dirname)=~s,.*/,,; +($caps=$tagname)=~tr/[a-z]/[A-Z]/; +#print "cfg is $cfg\n"; +#print "dir is $dirname\n"; +#print "filename is $filename\n"; +sub wanted; + +if(-e "$dirname/config.in.in"){ + my $contents; + open(FILE, "<$dirname/config.in.in"); + while(<FILE>){ $contents.=$_; } + close(FILE); + if($contents=~/\@sources\@/){ + ($post = $contents) =~ s/^.*\@sources\@//s; + ($pre = $contents) =~ s/\@sources\@.*$//s; + } else { + $pre = $contents; + } +} else { + $pre = "menu \"$tagname\"\n"; + $post = "endmenu\n"; +} + +open(CFG, ">$cfg") || die "Unable to open $cfg for writing\n"; +select(CFG); +print $pre; +@dupecheck=(); +File::Find::find({wanted => \&wanted}, $dirname); +print $post; +select(STDOUT); +close(CFG); + +exit; + +open(FILE,">$dir/config.in"); +select(FILE); +print "menu \"$name\"\n"; +print "\n"; +my @subdirs=(); +my @dirs; +foreach(grep(/^$dir/, @dirs)){ + chomp; + /^$dir\/$name.pro$/ && next; + my $localdir=$_; + if($dir=~m,^$localdir$,){ + next; + } +#($locadir=$_)~s,/[^/]+$,,g; + if($localdir=~/^\.$/){next;} + if(grep(/^$localdir$/, @subdirs)){next;} + my $nslashes = $localdir =~ tr!/!!; + my $dirnslashes = $dir =~ tr!/!!; + $dirnslashes++; + if($dirnslashes != $nslashes ){next;} + print STDERR "$localdir/config.in\n"; + print " source $localdir/config.in\n"; + push(@subdirs, $localdir); + print "endmenu\n"; + select(STDOUT); + close(FILE); +} + +use vars qw/*name *dir *prune/; +*name = *File::Find::name; +*dir = *File::Find::dir; +*prune = *File::Find::prune; + +sub wanted { + if( /config.in/s ) { + if(grep(/^$File::Find::dir\/config.in$/, @dupecheck)){ + return; + } + my $nslashes = $File::Find::dir =~ tr!/!!; + my $dirnslashes = $dirname =~ tr!/!!; + $dirnslashes++; +# print STDERR "dirnslashes is $dirnslashes\n"; +# print STDERR "nslashes is $nslashes\n"; + if($dirnslashes != $nslashes){return;} + print " source " . $File::Find::dir . "/config.in\n"; + push(@dupecheck, $File::Find::dir . "/config.in"); + } +} |