[gimp] pdbgen: make it work with a read-only srcdir



commit 44752a0f099b2a473a3c15266eeb6b0d73f59bf3
Author: Michael Natterer <mitch gimp org>
Date:   Sun Nov 6 17:33:20 2011 +0100

    pdbgen: make it work with a read-only srcdir
    
    Pass srcdir *and* builddir to all pdbgen scripts, and generate all
    temp files in $builddir. They get copied for $srcdir only if they have
    actually changed, which should never happen on distcheck.

 tools/pdbgen/Makefile.am |    8 ++++++--
 tools/pdbgen/app.pl      |   15 ++++++++-------
 tools/pdbgen/enumcode.pl |   13 +++++++------
 tools/pdbgen/enumgen.pl  |    9 +++++----
 tools/pdbgen/lib.pl      |   15 ++++++++-------
 tools/pdbgen/pdbgen.pl   |    6 ++++--
 tools/pdbgen/util.pl     |    8 +++++++-
 7 files changed, 45 insertions(+), 29 deletions(-)
---
diff --git a/tools/pdbgen/Makefile.am b/tools/pdbgen/Makefile.am
index 3310de5..7f44165 100644
--- a/tools/pdbgen/Makefile.am
+++ b/tools/pdbgen/Makefile.am
@@ -110,6 +110,8 @@ $(srcdir)/enums.pl: stamp-enums
 	@:
 stamp-enums: $(srcdir)/enumgen.pl $(enum_headers) Makefile.am
 	rootme=`pwd`; \
+	destdir=`cd $(top_srcdir) && pwd`; export destdir; \
+	builddir=`cd $(top_builddir) && pwd`; export builddir; \
 	cd $(srcdir) && $(PERL) enumgen.pl $(enum_headers) \
 	&& echo timestamp > $$rootme/stamp-enums
 
@@ -131,7 +133,8 @@ stamp-groups: Makefile.am
 
 stamp-pdbgen: $(pdbgen_deps) $(pdb_scripts) $(pdb_sources) Makefile.am
 	rootme=`pwd`; \
-	destdir=`cd $(top_builddir) && pwd`; export destdir; \
+	destdir=`cd $(top_srcdir) && pwd`; export destdir; \
+	builddir=`cd $(top_builddir) && pwd`; export builddir; \
 	cd $(srcdir) && \
 	   PDBGEN_BACKUP=$(PDBGEN_BACKUP) PDBGEN_GROUPS=$(PDBGEN_GROUPS) \
 	   $(PERL) pdbgen.pl app lib \
@@ -139,7 +142,8 @@ stamp-pdbgen: $(pdbgen_deps) $(pdb_scripts) $(pdb_sources) Makefile.am
 
 stamp-enum-code: $(srcdir)/enumcode.pl $(enum_deps)
 	rootme=`pwd`; \
-	destdir=`cd $(top_builddir) && pwd`; export destdir; \
+	destdir=`cd $(top_srcdir) && pwd`; export destdir; \
+	builddir=`cd $(top_builddir) && pwd`; export builddir; \
 	cd $(srcdir) && \
 	  PDBGEN_BACKUP=$(PDBGEN_BACKUP) \
 	  $(PERL) enumcode.pl \
diff --git a/tools/pdbgen/app.pl b/tools/pdbgen/app.pl
index bd67731..ce8e893 100644
--- a/tools/pdbgen/app.pl
+++ b/tools/pdbgen/app.pl
@@ -16,7 +16,8 @@
 
 package Gimp::CodeGen::app;
 
-$destdir = "$main::destdir/app/pdb";
+$destdir  = "$main::destdir/app/pdb";
+$builddir = "$main::builddir/app/pdb";
 
 *arg_types = \%Gimp::CodeGen::pdb::arg_types;
 *arg_parse = \&Gimp::CodeGen::pdb::arg_parse;
@@ -812,7 +813,7 @@ GPL
 	    $extra = $main::grp{$group}->{extra}->{app}
 	}
 
-	my $cfile = "$destdir/".canonicalize(${group})."-cmds.c$FILE_EXT";
+	my $cfile = "$builddir/".canonicalize(${group})."-cmds.c$FILE_EXT";
 	open CFILE, "> $cfile" or die "Can't open $cfile: $!\n";
 	print CFILE $gpl;
 	print CFILE qq/#include "config.h"\n\n/;
@@ -823,7 +824,7 @@ GPL
 	print CFILE "\nvoid\nregister_${group}_procs (GimpPDB *pdb)\n";
 	print CFILE "{\n  GimpProcedure *procedure;\n$out->{register}}\n";
 	close CFILE;
-	&write_file($cfile);
+	&write_file($cfile, $destdir);
 
 	my $decl = "register_${group}_procs";
 	push @group_decls, $decl;
@@ -834,7 +835,7 @@ GPL
     }
 
     if (! $ENV{PDBGEN_GROUPS}) {
-	my $internal = "$destdir/internal-procs.h$FILE_EXT";
+	my $internal = "$builddir/internal-procs.h$FILE_EXT";
 	open IFILE, "> $internal" or die "Can't open $internal: $!\n";
 	print IFILE $gpl;
 	my $guard = "__INTERNAL_PROCS_H__";
@@ -856,9 +857,9 @@ HEADER
 #endif /* $guard */
 HEADER
 	close IFILE;
-	&write_file($internal);
+	&write_file($internal, $destdir);
 
-	$internal = "$destdir/internal-procs.c$FILE_EXT";
+	$internal = "$builddir/internal-procs.c$FILE_EXT";
 	open IFILE, "> $internal" or die "Can't open $internal: $!\n";
 	print IFILE $gpl;
 	print IFILE qq #include "config.h"\n\n@;
@@ -878,7 +879,7 @@ $group_procs
 }
 BODY
 	close IFILE;
-	&write_file($internal);
+	&write_file($internal, $destdir);
     }
 }
 
diff --git a/tools/pdbgen/enumcode.pl b/tools/pdbgen/enumcode.pl
index d3335dc..7037517 100755
--- a/tools/pdbgen/enumcode.pl
+++ b/tools/pdbgen/enumcode.pl
@@ -17,8 +17,9 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 BEGIN {
-    $srcdir  = $ENV{srcdir}  || '.';
-    $destdir = $ENV{destdir} || '.';
+    $srcdir   = $ENV{srcdir}  || '.';
+    $destdir  = $ENV{destdir} || '.';
+    $builddir = $ENV{builddir} || '.';
 }
 
 use lib $srcdir;
@@ -31,7 +32,7 @@ require 'util.pl';
 *write_file = \&Gimp::CodeGen::util::write_file;
 *FILE_EXT   = \$Gimp::CodeGen::util::FILE_EXT;
 
-my $enumfile = "$destdir/libgimp/gimpenums.h$FILE_EXT";
+my $enumfile = "$builddir/libgimp/gimpenums.h$FILE_EXT";
 open ENUMFILE, "> $enumfile" or die "Can't open $enumfile: $!\n";
 
 print ENUMFILE <<'LGPL';
@@ -106,9 +107,9 @@ G_END_DECLS
 HEADER
 
 close ENUMFILE;
-&write_file($enumfile);
+&write_file($enumfile, "$destdir/libgimp");
 
-$enumfile = "$destdir/libgimp/gimpenums.c.tail$FILE_EXT";
+$enumfile = "$builddir/libgimp/gimpenums.c.tail$FILE_EXT";
 open ENUMFILE, "> $enumfile" or die "Can't open $enumfile: $!\n";
 
 print ENUMFILE <<CODE;
@@ -214,4 +215,4 @@ gimp_enums_get_type_names (gint *n_type_names)
 CODE
 
 close ENUMFILE;
-&write_file($enumfile);
+&write_file($enumfile, "$destdir/libgimp");
diff --git a/tools/pdbgen/enumgen.pl b/tools/pdbgen/enumgen.pl
index 1e35de9..9fd62d6 100755
--- a/tools/pdbgen/enumgen.pl
+++ b/tools/pdbgen/enumgen.pl
@@ -17,8 +17,9 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 BEGIN {
-    $srcdir  = $ENV{srcdir} || '.';
-    $destdir = $ENV{srcdir} || '.';
+    $srcdir   = $ENV{srcdir}   || '.';
+    $destdir  = $ENV{destdir}   || '.';
+    $builddir = $ENV{builddir} || '.';
 }
 
 use lib $srcdir;
@@ -252,8 +253,8 @@ $code =~ s/,\n$/\n/s;
 
 foreach ($header, $code, $footer) { s/^://mg }
 
-$outfile = "$destdir/enums.pl$FILE_EXT";
+$outfile = "$builddir/tools/pdbgen/enums.pl$FILE_EXT";
 open OUTFILE, "> $outfile";
 print OUTFILE $header, $code, $footer;
 close OUTFILE;
-&write_file($outfile);
+&write_file($outfile, "$destdir/tools/pdbgen");
diff --git a/tools/pdbgen/lib.pl b/tools/pdbgen/lib.pl
index 9f55f80..45f96c9 100644
--- a/tools/pdbgen/lib.pl
+++ b/tools/pdbgen/lib.pl
@@ -17,7 +17,8 @@
 package Gimp::CodeGen::lib;
 
 # Generates all the libgimp C wrappers (used by plugins)
-$destdir = "$main::destdir/libgimp";
+$destdir  = "$main::destdir/libgimp";
+$builddir = "$main::builddir/libgimp";
 
 *arg_types = \%Gimp::CodeGen::pdb::arg_types;
 *arg_parse = \&Gimp::CodeGen::pdb::arg_parse;
@@ -516,8 +517,8 @@ LGPL
         }
         $hname =~ s/_//g; $hname =~ s/pdb\./_pdb./;
         $cname =~ s/_//g; $cname =~ s/pdb\./_pdb./;
-	my $hfile = "$destdir/$hname$FILE_EXT";
-	my $cfile = "$destdir/$cname$FILE_EXT";
+	my $hfile = "$builddir/$hname$FILE_EXT";
+	my $cfile = "$builddir/$cname$FILE_EXT";
 
 	my $extra = {};
 	if (exists $main::grp{$group}->{extra}->{lib}) {
@@ -650,7 +651,7 @@ G_END_DECLS
 #endif /* $guard */
 HEADER
 	close HFILE;
-	&write_file($hfile);
+	&write_file($hfile, $destdir);
 
 	open CFILE, "> $cfile" or die "Can't open $cfile: $!\n";
         print CFILE $lgpl_top;
@@ -680,11 +681,11 @@ SECTION_DOCS
 	print CFILE "\n", $extra->{code} if exists $extra->{code};
 	print CFILE $out->{code};
 	close CFILE;
-	&write_file($cfile);
+	&write_file($cfile, $destdir);
     }
 
     if (! $ENV{PDBGEN_GROUPS}) {
-        my $gimp_pdb_headers = "$destdir/gimp_pdb_headers.h$FILE_EXT";
+        my $gimp_pdb_headers = "$builddir/gimp_pdb_headers.h$FILE_EXT";
 	open PFILE, "> $gimp_pdb_headers" or die "Can't open $gimp_pdb_headers: $!\n";
         print PFILE $lgpl_top;
         print PFILE " * gimp_pdb_headers.h\n";
@@ -716,6 +717,6 @@ HEADER
 #endif /* $guard */
 HEADER
 	close PFILE;
-	&write_file($gimp_pdb_headers);
+	&write_file($gimp_pdb_headers, $destdir);
     }
 }
diff --git a/tools/pdbgen/pdbgen.pl b/tools/pdbgen/pdbgen.pl
index 6c399fc..713fd26 100755
--- a/tools/pdbgen/pdbgen.pl
+++ b/tools/pdbgen/pdbgen.pl
@@ -19,8 +19,9 @@
 require 5.004;
 
 BEGIN {
-    $srcdir  = $ENV{srcdir}  || '.';
-    $destdir = $ENV{destdir} || '.';
+    $srcdir   = $ENV{srcdir}   || '.';
+    $destdir  = $ENV{destdir}  || '.';
+    $builddir = $ENV{builddir} || '.';
 }
 
 use lib $srcdir;
@@ -41,6 +42,7 @@ BEGIN {
 
 # Stifle "used only once" warnings
 $destdir = $destdir;
+$builddir = $builddir;
 %pdb = ();
 
 # The actual parser (in a string so we can eval it in another namespace)
diff --git a/tools/pdbgen/util.pl b/tools/pdbgen/util.pl
index b4da4b6..aeaa167 100644
--- a/tools/pdbgen/util.pl
+++ b/tools/pdbgen/util.pl
@@ -16,6 +16,7 @@
 
 package Gimp::CodeGen::util;
 
+use File::Basename 'basename';
 use File::Copy 'cp';
 use File::Compare 'cmp';
 
@@ -24,8 +25,13 @@ $DEBUG_OUTPUT = exists $ENV{PDBGEN_BACKUP} ? $ENV{PDBGEN_BACKUP} : 1;
 $FILE_EXT = ".tmp.$$";
 
 sub write_file {
-    my $file = shift; my $realfile = $file;
+    my $file = shift;
+    my $destdir = shift;
+
+    my $realfile = basename($file);
     $realfile =~ s/$FILE_EXT$//;
+    $realfile = "$destdir/$realfile";
+
     if (-e $realfile) {
 	if (cmp($realfile, $file)) {
 	    cp($realfile, "$realfile~") if $DEBUG_OUTPUT;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]