summaryrefslogtreecommitdiff
authorkergoth <kergoth>2002-11-05 02:33:22 (UTC)
committer kergoth <kergoth>2002-11-05 02:33:22 (UTC)
commited163d67a674b1c4ac6b7e917a509029da446dfb (patch) (side-by-side diff)
treed444f6395e82b1dd66f0ce8a413348a6f183bad3
parent9ac6d0a443c417158e3f2acf2de0629c51b6511c (diff)
downloadopie-ed163d67a674b1c4ac6b7e917a509029da446dfb.zip
opie-ed163d67a674b1c4ac6b7e917a509029da446dfb.tar.gz
opie-ed163d67a674b1c4ac6b7e917a509029da446dfb.tar.bz2
config.in generation to reduce maintainance headaches
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--Makefile.test8
-rw-r--r--Rules.make7
-rwxr-xr-xscripts/makecfg.pl98
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
+
diff --git a/Rules.make b/Rules.make
index 2fa5e7f..96e528b 100644
--- a/Rules.make
+++ b/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");
+ }
+}