re-write of Build scripts
Steve Scaffidi [Wed, 26 Aug 2009 15:49:40 +0000 (11:49 -0400)]
Build.PL
BuildStem.pm

index 35743fb..3da144c 100644 (file)
--- a/Build.PL
+++ b/Build.PL
-use strict;
-use warnings ;
+#!/usr/bin/env perl
 
-use Config;
-use File::Spec;
+use strict ;
+use warnings ;
 
+use Config ;
+use File::Spec ;
 use BuildStem ;
+use Data::Dumper ;
 
-my $is_win32 = ( $^O =~ /Win32/) ? 1 : 0 ;
+# I wonder if I should add the ability to put the Docs and Design etc
+# directories in apropriate spots, like 
+# /usr/local/share/stem (site) or /usr/share/stem (vendor)
 
 my %requires ;
 
 my $version_from = File::Spec->catfile( File::Spec->curdir, 'lib', 'Stem.pm' );
 
 my $build = BuildStem->new(
+#my $build = $class->new(
        module_name             => 'Stem',
        dist_version_from       => $version_from,
        requires                => \%requires,
+       dist_abstract           => 'ABSTRACT GOES HERE',
        license                 => 'gpl',
        dynamic_config          => 1,
        recursive_test_files    => 1,
        create_makefile_pl      => 'passthrough'
 );
 
-# since we are making a fresh Build script, delete any older stem config file
-# so Build will create a new one.
 
-my $conf_pm_file = $build->config_pm_path() ;
-unlink $conf_pm_file ;
+
+$build->is_unixish() || die "Stem currently only installs properly on *nix-like platforms.\n";
+
+### this will come in handy for some refactoring...
+## $build->config( 'install_base' )
+
+print <<'EOT';
+
+Building Stem
+
+This script will ask you various questions in order to properly
+configure, build and install Stem on your system.  Whenever a question
+is asked, the default answer will be shown inside [brackets].
+Pressing enter will accept the default answer. If a choice needs to be
+made from a list of values, that list will be inside (parentheses).
+
+If you have already configured Stem in a previous build, you can put
+use_defaults=1 on the Build command line and you won't be prompted for
+any answers and the previous settings will be used.
+
+If you want to force a new build, run Build clean.
+
+----------------------------------------------------------------------------
+
+EOT
+
+print <<'EOT';
+
+Stem comes with a utility called 'run_stem' which takes care of things
+like initalizing Stem with a configuration file and controlling it's 
+operation via various parameters you can pass in as environment 
+variables or command line arguments. 
+
+Stem configuration files are used to create and initialize Stem Cells
+(objects). run_stem can search a path list for config files, so you 
+can set that list of directories here.
+
+Note that you can easily override this path with either a shell environment
+variable or on the command line of run_stem. See the documentation on
+run_stem for how so do this.
+
+The last directory in the list is where the standard and demo Stem
+configuration files will be installed.
+
+Please enter a list of directory paths separated by ':'.
+
+EOT
+
+my $conf_path = $build->prompt(
+       "What directories do you want Stem to search for configuration files?\n",
+       '.:~/.stem/conf:/usr/local/stem/conf'
+);
+$build->config_data(conf_path => $conf_path);
+
+
+
+
+
+
+=begin comment
+
+print "\n\nChecking to see if you have a good C compiler...\n\n" ;
+if ( $build->have_c_compiler() ) {
+       print <<'EOT';
+       
+       
+ssfe (Split Screen Front End) is a compiled program optionally used by
+the Stem demonstration scripts that provides a full screen interface
+with command line editing and history. It is not required to run Stem
+but it makes the demonstrations easier to work with and they look much
+nicer. To use ssfe add the '-s' option when you run any demonstration
+script. You can also use ssfe for your own programs.  Install ssfe in
+some place in your $PATH ($conf->{'bin_path'} is where Stem executables
+are being installed) so it can be used by the demo scripts. The ssfe
+install script will do this for you or you can do it manually after
+building it.
+
+EOT
+       my $install_ssfe = $build->y_n("Do you want to install ssfe?\n", 'y');
+       $build->config_data(install_ssfe => $install_ssfe);
+       if ( $install_ssfe ) {
+
+               # Do horrible, nasty things.
+               # This really should be done with a proper makefile.
+
+       }
+}
+
+=cut
+
+
+
+
+
+print <<'EOT';
+
+Stem comes with a variety of demos to show how to get started and do some 
+basic things.
+
+EOT
+my $install_demos = $build->y_n("\nDo you want to install the demos?\n",'n');
+$build->config_data( install_demos => $install_demos ) ;
+$build->config_data( build_demos => $install_demos ) ;
+if ( $install_demos ) {
+
+       my $demo_dir = $build->prompt(
+               "\nWhere do you want to install the demo scripts?\n",
+               '/usr/local/stem/demo'
+       );
+       $build->config_data(demo_dir => $demo_dir);
+       $build->install_path()->{demo} ||= $demo_dir;
+
+
+
+       my $demo_conf_dir = $build->prompt(
+               "\nWhere do you want to install the demo config files?\n",
+               '/usr/local/stem/conf'
+       );
+       $build->config_data(demo_conf_dir => $demo_conf_dir);
+       $build->install_path()->{conf} ||= $demo_conf_dir;
+       $build->add_build_element('conf');
+
+       my $cur_conf_path = $build->config_data('conf_path') ;
+       my $new_conf_path = $cur_conf_path =~ /(^|:)$demo_conf_dir(:|$)/ ?
+               $cur_conf_path : "$cur_conf_path:$demo_conf_dir" ;
+       $build->config_data( conf_path => $new_conf_path ) ;
+
+
+       # Check for telnet
+       my $telnet_path = $build->find_binary( 'telnet' ) || '' ;
+       while ( ! -x $telnet_path && ! $build->_is_unattended() ) {
+               print <<'EOT';
+
+
+telnet was not found on this system. you can't run the demo programs
+without telnet.  Make sure you enter a valid path to telnet or some other
+terminal emulator.
+
+NOTE: If you don't have an telnet, you can still run the demo scripts
+by hand. Run a *_demo script and see what telnet commands it
+issues. The run those telnet commands using your telnet or another
+similar program.
+
+EOT
+               $telnet_path = $build->prompt(
+                         "Enter the path to telnet "
+                       . "(or another compatible telnet client)",
+            '/usr/bin/telnet'
+               ) ;
+       }
+       $build->config_data( telnet_path => $telnet_path ) ;
+
+
+       # Check for xterm
+       my $xterm_path = $build->find_binary( 'xterm' ) || '' ;
+       while ( ! -x $xterm_path && ! $build->_is_unattended() ) {
+               print <<'EOT';
+
+
+xterm was not found on this system. you can't run the demo programs
+without xterm.  Make sure you enter a valid path to xterm or some other
+terminal emulator.
+
+NOTE: If you don't have an xterm, you can still run the demo scripts
+by hand. Run a *_demo script and see what commands it issues. Take the
+part after the -e and run that command in its own terminal window.
+
+EOT
+               $xterm_path = $build->prompt(
+                         "Enter the path to xterm "
+                       . "(or another compatible terminal emulator)",
+            '/usr/bin/xterm'
+               ) ;
+       }
+       $build->config_data( xterm_path => $xterm_path ) ;
+
+}
+
+
+
+my $script_dest = $build->install_destination('script') ;
+my $run_stem_path = File::Spec->catfile( $script_dest, 'run_stem' ) ;
+$build->config_data( run_stem_path => $run_stem_path ) ;
+
+
+
+
+my $bin_path = $build->install_destination('bin') ;
+$build->config_data( bin_path => $bin_path ) ;
+
+$build->config_data( perl_path => $build->config( 'perlpath' ) ) ;
+
+# Several different prefixes... which one to use??
+#$build->config_data( prefix => $build->prefix() ) ;
+$build->config_data( prefix => $build->config( 'install_base' ) ) ;
+
+
+$build->config_data( config_done => 1 ) ;
+
+
+#print Dumper \%{ $build->config_data() };
+
 
 $build->create_build_script() ;
 
 exit ;
+
+1 ;
index 3711f98..cceef07 100644 (file)
-package BuildStem ;
+package BuildStem;
 
 use strict;
-use warnings qw( all );
+use warnings;
 
-use Carp ;
 use Config;
-use File::Path ;
-use File::Spec ;
+use File::Basename;
+use File::Spec;
+use IO::File;
 
-use lib 'lib' ;
-use base 'Module::Build' ;
+use Module::Build;
 
-$ENV{HARNESS_DEBUG} = 1 ;
-$ENV{HARNESS_VERBOSE} = 1 ;
+use vars qw(@ISA);
+@ISA = qw(Module::Build);
 
-# this is the common env values to control running stem stuff in the
-# build directory.
-
-my $env =
-       'PATH=blib/bin:blib/demo:$PATH PERL5LIB=blib/lib STEM_CONF_PATH=conf' ;
-
-my %env = (
-       PATH    => "blib/bin:blib/demo:$ENV{PATH}",
-       PERL5LIB => 'blib/lib',
-       STEM_CONF_PATH  => 'conf',
-) ;
-
-local( @ENV{ keys %env } ) = values %env ;
-
-
-my ( @manifest_lines ) ;
-
-eval {
-       require Stem::InstallConfig
-} ;
-my $conf = \%Stem::InstallConfig::Config ;
-
-my $is_win32 = ( $^O =~ /Win32/) ? 1 : 0 ;
-
-my $default_stem_path = $is_win32 ?
-               '/stem' :
-               File::Spec->catfile(
-                       File::Spec->rootdir, qw( usr local stem ) ) ;
-
-my $default_conf_path = File::Spec->catfile( $default_stem_path, 'conf' ) ;
-#my $default_tail_dir = File::Spec->catfile( File::Spec->tmpdir, 'stem_tail' );
-
-my %defaults = (
-       bin_path        => $Config{bin},
-       run_stem_path   => File::Spec->catfile( $Config{bin}, 'run_stem' ),
-       perl_path       => $Config{perlpath},
-       conf_path       => $default_conf_path,
-       prefix          => $Config{prefix},
-#      tail_dir        => $default_tail_dir,
-       build_demos     => ! $is_win32,
-       install_demos   => ! $is_win32,
-       install_ssfe    => ! $is_win32,
-       %{$conf}
-);
-
-################
-# these are the top level action handlers. ACTION_foo gets called when you do
-# 'Build foo' on the command line
-################
-
-sub ACTION_build {
-
-       my ( $self ) = @_ ;
-
-       $self->query_for_config() ;
-
-       $self->SUPER::ACTION_build() ;
-
-#      $self->build_bin() ;
-}
-
-sub ACTION_test {
-
-       my ( $self ) = @_ ;
-
-       local( @ENV{ keys %env } ) = values %env ;
-
-       $self->depends_on('build');
-
-       $self->SUPER::ACTION_test() ;
-}
-
-sub ACTION_install {
-
-       my ( $self ) = @_ ;
-
-       $self->install_config_files() ;
-#      $self->install_ssfe() ;
-
-       $self->SUPER::ACTION_install() ;
-}
-
-sub ACTION_run { 
-
-       my ( $self ) = @_ ;
-
-       $self->depends_on('build');
-
-       my $run_cmd = $self->{'args'}{'cmd'} || '' ;
-
-       $run_cmd or die "Missing cmd=name argument" ;
-
-       my $cmd = "$env $run_cmd" ;
-#      print "CMD: $cmd\n" ;
-
-       system $cmd ;
-}
-
-sub ACTION_run_stem { 
-
-       my ( $self ) = @_ ;
-
-       $self->depends_on('build');
-
-       my $conf = $self->{'args'}{'conf'} || '' ;
-
-       $conf or die "Missing conf=name argument" ;
-
-       my $cmd = "$env run_stem $conf" ;
-#      print "DEMO: $cmd\n" ;
-
-       system $cmd ;
-}
-
-
-sub run_demo { 
-
-       my ( $self ) = @_ ;
-
-       $self->depends_on('build');
-
-       my $cmd = "$env $self->{action}_demo" ;
-       print "DEMO: $cmd\n" ;
-       system $cmd ;
-}
-
-
-sub ACTION_tail {
-
-       mkdir 'tail' ;
-       
-       unlink <tail/*> ;
-
-       goto &run_demo ;
-}
-
-*ACTION_chat = \&run_demo ;
-*ACTION_chat2 = \&run_demo ;
-*ACTION_inetd = \&run_demo ;
-
-sub ACTION_update_pod {
-
-       my( $self ) = @_ ;
-
-       my @manifest_sublist = $self->grep_manifest( qr/\.pm$/ ) ;
-
-       @manifest_sublist = grep /Codec/, @manifest_sublist ;
-
-print join( "\n", @manifest_sublist ), "\n" ;
-       
-       system( "bin/spec2pod.pl @manifest_sublist" ) ;
-
-       return;
-}
-
-# grep through all matched files
-# command line args:
-#      files=<regex> (default is all .pm files)
-#      re=<regex>
-
-sub ACTION_grep {
-
-       my( $self ) = @_ ;
-
-       my $args = $self->{'args'} ;
-
-       my $file_regex = $args->{ files } || qr/\.pm$/ ;
-       my $grep_regex = $args->{ re } or die "need grep regex" ; 
-
-       my @manifest_sublist = $self->grep_manifest( $file_regex ) ;
-
-       local( @ARGV ) = @manifest_sublist ;
-
-       while( <> ) {
-
-               next unless /$grep_regex/ ;
-
-               print "$ARGV:$. $_"
-       }
-       continue {
-
-               close ARGV if eof ;
-       }
-
-       return;
-}
-
-# ACTION: grep through MANIFEST
-# command line args:
-#      files=<regex>
-#
-# do we need this action?
-# 
-
-sub ACTION_grep_manifest {
-
-       my( $self ) = @_ ;
-
-       my @manifest_sublist = $self->grep_manifest() ;
-
-       print join( "\n", @manifest_sublist ), "\n" ;
-       return;
-}
-
-# ACTION: count source lines
-# command line args:
-#      files=<regex> (defaults to all .pm and bin files
-#
-# do we need this action?
-
-sub ACTION_lines {
-
-       my( $self ) = @_ ;
-
-       my $args = $self->{'args'} ;
-       my $file_regex = $args->{ files } || qr/\.pm$|^bin/ ;
-
-       my @manifest_sublist = $self->grep_manifest( $file_regex ) ;
-
-       system( "./util/lines @manifest_sublist" ) ;
-
-       return;
-}
-
-# build a distro and scp to stemsystems.com
-
-sub ACTION_ftp {
-
-       my ( $self ) = @_ ;
-
-       my $dist_tar = $self->dist_dir() . '.tar.gz' ;
-
-       unlink $dist_tar ;
-
-       $self->ACTION_dist() ;
-
-       system "scp $dist_tar stemsystems.com:www/" ;
-}
-
-
-# this sub overrides the find_test_files method in Module::Build
-
-sub find_test_files {
-
-       my ($self) = @_;
-
-       my $test_args = $self->{ args }{ tests } ;
-
-       my @tests = $test_args ? split( ':', $test_args ) :
-                   $self->grep_manifest( qr/\.t$/ ) ;
-
-       return \@tests ;
-}
 
 sub process_script_files {
-       my( $self ) = @_ ;
-
-       my @scripts = $self->grep_manifest( qr{^bin/} ) ;
-
-#print "SCR @scripts\n" ;
-       foreach my $file ( @scripts ) {
-
-               my $bin_dir = File::Spec->catdir(
-                               $self->blib,
-                               $file =~ /_demo$/ ? 'demo' : 'bin' ) ;
-
-               File::Path::mkpath( $bin_dir );
-  
-               my $result = $self->copy_if_modified(
-                       $file, $bin_dir, 'flatten') or next;
-
-#print "COPY $file\n" ;
-               $self->fix_run_stem($result);
-               $self->fix_demos($result);
-               $self->fix_shebang_line($result);
-               $self->make_executable($result);
-       }
-}
-
-sub fix_run_stem {
-
-       my( $self, $file ) = @_ ;
-
-       return unless $file =~ m{/run_stem$} ;
-
-       my $text = read_file( $file ) ;
-
-       $text =~ s/'conf:.'/'$conf->{'conf_path'}'/ if $conf->{'conf_path'} ;
-
-       write_file( $file, $text ) ;
-}
-
-sub fix_demos {
-
-       my( $self, $file ) = @_ ;
-
-       return unless $file =~ /_demo$/ ;
-
-       my $text = read_file( $file ) ;
-
-       $conf->{xterm_path} ||= 'NOT FOUND' ;
-       $conf->{telnet_path} ||= 'NOT FOUND' ;
-
-       $text =~ s[xterm][$conf->{xterm_path}]g;
-       $text =~ s[telnet][$conf->{telnet_path}]g;
-
-       write_file( $file, $text ) ;
-}
-
-# MANIFEST helper subs
-
-sub grep_manifest {
-
-       my( $self, $file_regex ) = @_ ;
-
-       $file_regex ||= $self->{ args }{ files } || qr/.*/ ;
-
-       manifest_load() ;
-
-       return grep( /$file_regex/, @manifest_lines ) ;
-}
-
-sub manifest_load {
-
-       return if @manifest_lines ;
-
-       @manifest_lines = grep ! /^\s*$|^\s*#/, read_file( 'MANIFEST' ) ;
-
-       chomp @manifest_lines ;
-
-       return ;
-}
-
-#################################
-
-sub query_for_config {
-
-       my( $self ) = @_ ;
-
-       return if $defaults{ 'config_done' } ;
-
-       print <<'EOT';
-
-Building Stem
-
-This script will ask you various questions in order to properly
-configure, build and install Stem on your system.  Whenever a question
-is asked, the default answer will be shown inside [brackets].
-Pressing enter will accept the default answer. If a choice needs to be
-made from a list of values, that list will be inside (parentheses).
-
-If you have already configured Stem in a previous build, you can put
-use_defaults=1 on the Build command line and you won't be prompted for
-any answers and the previous settings will be used.
-
-If you want to force a new build, run Build clean.
-
-EOT
-
-       $self->get_path_config() ;
-       $self->get_demo_config() ;
-
-       $defaults{ 'config_done' } = 1 ;
-
-       $self->write_config_pm() ;
-}
-
-
-my $package = 'Stem::InstallConfig' ;
-
-sub config_pm_path {
-
-       return File::Spec->catfile(
-               File::Spec->curdir, 'lib', split( /::/, $package) ) . '.pm' ;
-
-}
-
-sub write_config_pm {
-
        my ( $self ) = @_ ;
-
-       my $config = Data::Dumper->Dump(
-               [\%defaults],
-               ["*${package}::Config"]
-       );
-
-       my $conf_pm_file = $self->config_pm_path() ;
-
-       $self->add_to_cleanup( $conf_pm_file ) ;
-
-       write_file( $conf_pm_file, <<EOT ) ;
-
-# DO NOT EDIT
-# this file is generated by running Build build
-
-package $package ;
-
-$config
-1 ;
-EOT
-
-}
-
-
-sub get_path_config {
-
-       my( $self ) = @_ ;
-
-#      $self->query_config_value( <<'EOT', 'perl_path' );
-
-# Stem has several executable Perl programs and demonstration scripts
-# and they need to have the correct path to your perl binary.
-
-# What is the path to perl?
-# EOT
-
-#      $self->query_config_value( <<'EOT', 'bin_path' );
-
-# Those Stem executables need to be installed in a directory that is in your
-# shell $PATH variable.
-
-# What directory will have the Stem executables?
-# EOT
-
-       $self->query_config_value( <<'EOT', 'conf_path' );
-
-Stem configuration files are used to create and initialize Stem Cells
-(objects). Stem needs to know the list of directories to search to
-find its configurations files.
-
-Note that the default has a single absolute path. You can test Stem
-configurations easily setting this path when executing run_stem. You
-can override or modify the path time with either a shell environment
-variable or on the command line of run_stem. See the documentation on
-run_stem for how so do this.
-
-The first directory in the list is where the standard Stem
-configuration files will be installed.
-
-Enter a list of absolute directory paths separated by ':'.
-
-What directories do you want to search for Stem configuration files?
-EOT
-
-       return ;
-}
-
-sub get_demo_config {
-
-       my( $self ) = @_ ;
-
-# don't even bother if win32
-
-       return if $is_win32 ;
-
-#      $self->get_config_boolean( <<'EOT', 'build_demos' );
-
-# Stem comes with several demonstration scripts. After building them,
-# they can be run from the main directory by the Build script: ./Build
-# chat, Build inetd, etc.  Do you want to build the demos?
-# EOT
-
-#      return unless $defaults{build_demos};
-
-# all the demos need xterm
-
-       $self->get_xterm_path();
-       $self->get_telnet_path();
-       return unless -x $defaults{xterm_path} && -x $defaults{telnet_path};
-
-#      $self->query_config_value( <<'EOT', 'tail_dir' );
-
-# The tail demo script needs a temporary working directory.  Enter the
-# path to a directory to use for this purpose.  If it does not exist,
-# this directory will be created.
-# EOT
-
-       $self->get_config_boolean( <<'EOT', 'install_ssfe' );
-
-ssfe (Split Screen Front End) is a compiled program optionally used by
-the Stem demonstration scripts that provides a full screen interface
-with command line editing and history. It is not required to run Stem
-but it makes the demonstrations easier to work with and they look much
-nicer. To use ssfe add the '-s' option when you run any demonstration
-script. You can also use ssfe for your own programs.  Install ssfe in
-some place in your \$PATH ($conf->{'bin_path'} is where Stem executables
-are being installed) so it can be used by the demo scripts. The ssfe
-install script will do this for you or you can do it manually after
-building it.
-
-Do you want to install ssfe?
-EOT
-
-}
-
-sub get_xterm_path {
-
-       my( $self ) = @_ ;
-
-       my $xterm_path;
-
-#      unless ( $xterm_path = which_exec( 'xterm' ) ) {
-
-#              foreach my $path ( qw(
-#                      /usr/openwin/bin/xterm
-#                      /usr/bin/X11/xterm
-#                      /usr/X11R6/bin/xterm ) ) {
-
-#                      next unless -x $path;
-#                      $xterm_path = $path ;
-#                      last;
-#              }
-#      }
-
-#      if ( $xterm_path ) {
-
-#              $defaults{'xterm_path'} = $xterm_path ;
-#              print "xterm was found at '$xterm_path'\n";
-#              return ;
-#      }
-
-       $self->query_config_value( <<"EOT", 'xterm_path' );
-
-xterm was not found on this system. you can't run the demo programs
-without xterm.  Make sure you enter a valid path to xterm or some other
-terminal emulator.
-
-NOTE: If you don't have an xterm, you can still run the demo scripts
-by hand. Run a *_demo script and see what commands it issues. Take the
-part after the -e and run that command in its own terminal window.
-
-Enter the path to xterm (or another compatible terminal emulator)
-EOT
-
-}
-
-sub get_telnet_path {
-
-       my( $self ) = @_ ;
-
-       my $telnet_path;
-
-       unless ( $telnet_path = which_exec( 'telnet' ) ) {
-
-# enter a list of common places to find telnet. or delete this as it
-# will almost always be in the path
-
-               foreach my $path ( qw( ) ) {
-
-                       next unless -x $path;
-                       $telnet_path = $path ;
-                       last;
+       my $files = $self->find_script_files();
+       return unless keys %$files;
+
+       my $script_dir = File::Spec->catdir($self->blib, 'script');
+       my $demo_dir   = File::Spec->catdir($self->blib, 'demo');
+       File::Path::mkpath( $script_dir );
+       File::Path::mkpath( $demo_dir );
+
+       foreach my $file (keys %$files) {
+               my $dest_dir = $file =~ /_demo$/ ? $demo_dir : $script_dir ;
+               my $result = $self->copy_if_modified($file, $dest_dir, 'flatten') or next;
+               $self->fix_shebang_line($result) if $self->is_unixish();
+               $self->make_executable($result);
+        my $demo_run_dir = File::Spec->catdir($self->base_dir(), 'demo');
+               if ( $result =~ /(?:run_stem$)|(?:_demo$)/ ) {
+                       my $result2 = $self->copy_if_modified($result, $demo_run_dir, 'flatten') or next;
+                       $self->add_to_cleanup($result2);
                }
        }
-
-       if ( $telnet_path ) {
-
-               $defaults{'telnet_path'} = $telnet_path ;
-               print "telnet was found at '$telnet_path'\n";
-               return ;
-       }
-
-       $self->query_config_value( <<"EOT", 'telnet_path' );
-
-telnet was not found on this system. you can't run the demo programs
-without telnet.  Make sure you enter a valid path to telnet or some other
-terminal emulator.
-
-NOTE: If you don't have an telnet, you can still run the demo scripts
-by hand. Run a *_demo script and see what telnet commands it
-issues. The run those telnet commands using your telnet or another
-similar program.
-
-Enter the path to telnet (or another compatible terminal emulator)
-EOT
-
+       return 1;
 }
 
-sub install_config_files {
-
+sub process_conf_files {
        my ( $self ) = @_ ;
+       my $files = $self->_find_file_by_type('stem','conf');
+       return unless keys %$files;
 
-       my ( $conf_path ) = split /:/, $conf->{conf_path} ;
-
-       mkpath( $conf_path, 1, 0755 ) unless -d $conf_path ;
-
-       my @config_files = $self->grep_manifest( qr{^conf/.+\.stem$} ) ;
-
-       foreach my $conf_file (@config_files) {
+       my $conf_dir = File::Spec->catdir($self->blib, 'conf');
+       File::Path::mkpath( $conf_dir );
 
-               $conf_file =~ s{conf/}{} ;
-
-               my $out_file = File::Spec->catfile( $conf_path, $conf_file );
-
-               print "Installing config file: $out_file\n";
-
-               my $in_file = File::Spec->catfile(
-                           File::Spec->curdir(), 'conf', $conf_file );
-
-               my $conf_text = read_file($in_file);
-
-               if ( $conf_file eq 'inetd.stem' ) {
-
-                       my $quote_serve = File::Spec->catfile(
-                               $conf->{bin_path}, 'quote_serve' );
-
-                       $conf_text =~ s[path\s+=>\s+'bin/quote_serve',]
-                                      [path\t\t=> '$quote_serve',];
-               }
-#              elsif ( $conf eq 'monitor.stem' || $conf eq 'archive.stem' ) {
-
-#                      $conf_text =~ s[path'\s+=>\s+'tail]
-#                                     [path'\t\t=> '$conf->{tail_dir}]g ;
-#              }
-
-               write_file( $out_file, $conf_text );
+       foreach my $file (keys %$files) {
+               my $result = $self->copy_if_modified($file, $conf_dir, 'flatten') or next;
+               $self->fix_shebang_line($result) if $self->is_unixish();
        }
+       return 1;
 }
 
-
-sub install_ssfe {
-
-       my ( $self ) = @_ ;
-
-       return unless $conf->{install_stem_demos} &&
-                     $conf->{install_ssfe} ;
-
-       print <<'EOT';
-
-Installing ssfe.
-
-This is not a Stem install script and it will ask its own
-questions. It will execute in its own xterm (whatever was configured
-earlier) to keep this install's output clean. The xterm is kept open
-with a long sleep call and can be exited by typing ^C.
-
-EOT
-
-#########
-# UGLY
-#########
-
-    system <<'EOT';
-xterm -e /bin/sh -c 'chdir extras ;
-tar zxvf sirc-2.211.tar.gz ;
-chdir sirc-2.211 ;
-./install ;
-sleep 1000 ;'
-EOT
-
-    print "\nInstallation of ssfe is done\n\n";
-}
-
-#########################################################
-# this sub builds the exec scripts in bin and puts them into blib/bin
-# for local running or later installation
-
-# sub build_bin {
-
-#      my ( $self ) = @_ ;
-
-#      my @bin_scripts = $self->grep_manifest( qr{^bin/} ) ;
-
-#      foreach my $bin_file ( @bin_scripts ) {
-
-# #print "BIN $bin_file\n" ;
-
-#              my $bin_text = read_file( $bin_file ) ;
-
-#              $bin_file =~ s{bin/}{} ;
-
-# # fix the shebang line
-
-#              $bin_text =~ s{/usr/local/bin/perl}{$conf->{'perl_path'}} ;
-
-#              my $bin_dir ;
-
-#              if ( $bin_file =~ /_demo$/ ) {
-
-#                      next unless $conf->{build_demos} ;
-
-#                      $bin_dir = 'demo' ;
-
-# # fix the location of xterms in the demo scripts
-
-#                      $bin_text =~ s[xterm][$conf->{xterm_path}]g;
-#                      $bin_text =~ s[telnet][$conf->{telnet_path}]g;
-
-# # fix the default config search path in run_stem
-#              }
-#              else {
-
-#                      $bin_dir = 'bin' ;
-
-# # fix the default config search path in run_stem
-
-#                      if ( $bin_file eq 'run_stem' ) {
-#                              $bin_text =~
-#                                      s/'conf:.'/'$conf->{'conf_path'}'/ ;
-#                      }
-#              }
-
-# #            elsif ( $bin_file eq 'tail_demo' ) {
-# #                    $bin_text =~ s['tail']['$conf->{tail_dir}'];
-# #            }
-
-# # write the built script into the blib/ dir
-
-#              my $out_file = File::Spec->catfile( 'blib',
-#                                                  $bin_dir,
-#                                                  $bin_file
-#              );
-
-#              mkdir "blib/$bin_dir" ;
-#              print "Building executable script: $out_file\n";
-#              write_file( $out_file, $bin_text );
-#              chmod 0755, $out_file;
-#      }
-# }
-
-#############################################################
-
-# this sub searches the path for the locations of an executable
-
-sub which_exec {
-
-       my ( $exec ) = @_;
-
-       foreach my $path_dir ( split /[:;]/, $ENV{PATH} ) {
-
-               my $exec_path = File::Spec->catfile( $path_dir, $exec );
-               return $exec_path if -x $exec_path ;
+sub find_binary {
+       my ( $self, $prog ) = @_ ;
+       if ( $self->do_system( "which $prog >/dev/null" ) ) {
+               return `which $prog` ;
        }
-
        return;
 }
 
-# the sub searches a list of dir paths to find the first one that
-# exists with a prefix dir
-
-# UNUSED FOR THE MOMENT
-
-# sub which_dir {
-
-#      my ( $prefix, @dirs ) = @_;
-
-#      foreach my $subdir ( @dirs ) {
-
-#              my $dir = File::Spec->catfile( $prefix, $subdir );
-#              return $dir if -x $dir;
-#      }
-
-#      return;
-# }
-
-#############################################################
-
-# these subs handle querying for a user answer. it uses the key to
-# find a current value in the defaults and prompt for another value
-# if 'use_defaults' is set on the command line, then no prompting will be done
-
-sub query_config_value {
-
-       my( $self, $query, $key ) = @_ ;
-
-       my $default = $self->{args}{$key} ;
-
-       $default = $defaults{ $key } unless defined $default ;
-
-       $defaults{ $key } = ( $self->{args}{use_defaults} ) ?
-               $default :
-               $self->prompt( edit_query( $query, $default ), $default ) ;
-}
-
-sub get_config_boolean {
-
-       my( $self, $query, $key ) = @_ ;
-
-       my $default = $self->{args}{$key} ;
-
-       $default = $defaults{ $key } unless defined $default ;
-       $default =~ tr/01/ny/ ;
-
-       $defaults{ $key } = ( $self->{args}{use_defaults} ) ?
-               $default :
-               $self->y_n( edit_query( $query, $default ), $default ) ;
-}
-
-sub edit_query {
-
-       my ( $query, $default ) = @_ ;
-
-       chomp $query ;
-
-       $default ||= '' ;
-
-       my $last_line = (split /\n/, $query)[-1] ;
-
-       if ( length( $last_line ) + 2 * length( $default ) > 70 ) {
-
-               $query .= "\n\t" ;
-       }
-
-       return $query ;
-}
-
-# low level file i/o subs. should be replaced with File::Slurp. stem
-# should depend on it
-
-
-sub read_file {
-
-       my ( $file_name ) = @_ ;
-
-       local( *FH );
-
-       open( FH, $file_name ) || croak "Can't open $file_name $!";
-
-       return <FH> if wantarray;
-
-       read FH, my $buf, -s FH;
-       return $buf;
-}
-
-sub write_file {
-
-       my( $file_name ) = shift ;
-
-       local( *FH ) ;
-
-       open( FH, ">$file_name" ) || croak "can't create $file_name $!" ;
-
-       print FH @_ ;
-}
 
-1 ;
+1;