@@ -56,8 +56,10 @@ sub Install
5656my $majorver = DetermineMajorVersion();
5757print " Installing version$majorver for$conf in$target \n " ;
5858
59- EnsureDirectories($target ,' bin' ,' lib' ,' share' ,' share/timezonesets' ,' share/contrib' ,' doc' ,
60- ' doc/contrib' ,' symbols' ,' share/tsearch_data' );
59+ EnsureDirectories($target ,' bin' ,' lib' ,' share' ,' share/timezonesets' ,
60+ ' share/extension' ,' share/contrib' ,
61+ ' doc' ,' doc/extension' ,' doc/contrib' ,
62+ ' symbols' ,' share/tsearch_data' );
6163
6264 CopySolutionOutput($conf ,$target );
6365 lcopy($target .' /lib/libpq.dll' ,$target .' /bin/libpq.dll' );
@@ -316,7 +318,27 @@ sub CopyContribFiles
316318
317319my $mf = read_file(" contrib/$d /Makefile" );
318320$mf =~s {\\ s*[\r\n ]+} {} mg ;
321+
322+ # Note: we currently don't support setting MODULEDIR in the makefile
323+ my $moduledir =' contrib' ;
324+
319325my $flist =' ' ;
326+ if ($mf =~/ ^EXTENSION\s *=\s *(.*)$ /m ) {$flist .=$1 }
327+ if ($flist ne ' ' )
328+ {
329+ $moduledir =' extension' ;
330+ $flist = ParseAndCleanRule($flist ,$mf );
331+
332+ foreach my $f (split /\s +/,$flist )
333+ {
334+ lcopy(' contrib/' .$d .' /' .$f .' .control' ,
335+ $target .' /share/extension/' .$f .' .control' )
336+ || croak(" Could not copy file$f .control in contrib$d " );
337+ print ' .' ;
338+ }
339+ }
340+
341+ $flist =' ' ;
320342if ($mf =~/ ^DATA_built\s *=\s *(.*)$ /m ) {$flist .=$1 }
321343if ($mf =~/ ^DATA\s *=\s *(.*)$ /m ) {$flist .=" $1 " }
322344$flist =~s / ^\s *// ;# Remove leading spaces if we had only DATA_built
@@ -327,7 +349,8 @@ sub CopyContribFiles
327349
328350foreach my $f (split /\s +/,$flist )
329351 {
330- lcopy(' contrib/' .$d .' /' .$f ,$target .' /share/contrib/' . basename($f ))
352+ lcopy(' contrib/' .$d .' /' .$f ,
353+ $target .' /share/' .$moduledir .' /' . basename($f ))
331354 || croak(" Could not copy file$f in contrib$d " );
332355print ' .' ;
333356 }
@@ -341,7 +364,8 @@ sub CopyContribFiles
341364
342365foreach my $f (split /\s +/,$flist )
343366 {
344- lcopy(' contrib/' .$d .' /' .$f ,$target .' /share/tsearch_data/' . basename($f ))
367+ lcopy(' contrib/' .$d .' /' .$f ,
368+ $target .' /share/tsearch_data/' . basename($f ))
345369 || croak(" Could not copy file$f in contrib$d " );
346370print ' .' ;
347371 }
@@ -359,7 +383,8 @@ sub CopyContribFiles
359383if ($d eq ' spi' );
360384foreach my $f (split /\s +/,$flist )
361385 {
362- lcopy(' contrib/' .$d .' /' .$f ,$target .' /doc/contrib/' .$f )
386+ lcopy(' contrib/' .$d .' /' .$f ,
387+ $target .' /doc/' .$moduledir .' /' .$f )
363388 || croak(" Could not copy file$f in contrib$d " );
364389print ' .' ;
365390 }
@@ -430,7 +455,7 @@ sub CopyIncludeFiles
430455' src/include/' ,' pg_config.h' ,' pg_config_os.h'
431456 );
432457 CopyFiles(' Grammar header' ,$target .' /include/server/parser/' ,
433- ' src/backend/parser/' ,' gram.h' );
458+ ' src/backend/parser/' ,' gram.h' );
434459 CopySetOfFiles(' ' ,[glob (" src\\ include\\ *.h" ) ],$target .' /include/server/' );
435460my $D ;
436461opendir ($D ,' src/include' ) || croak" Could not opendir on src/include!\n " ;