Remove extra periods from module messages.
[sepia.git] / Makefile.PL
blob2c204d206de5f35c5e186c113a474783fb54b96d
1 use warnings;
2 use strict;
4 use Pod::Usage;
5 use Getopt::Long;
7 use ExtUtils::MakeMaker qw(WriteMakefile prompt);
8 use 5.006;                      # for "no warnings" -- sorry!
9 # See lib/ExtUtils/MakeMaker.pm for details of how to influence
10 # the contents of the Makefile that is written.
12 my %prereq = (
13     'Data::Dumper'    => 0,
14     'Scalar::Util'    => 0,
17 ## Poor man's optional deps.
18 sub test_for
20     my $mod = shift;
21     eval "require $mod";
22     if ($@) {
23         my $resp = prompt("@_.  Install $mod (y/n)? ", 'n');
24         $prereq{$mod} = 0 if $resp =~ /^y/i;
25     }
28 my $ELISP_FIND_SITELISP = <<'END_ELISP';
29 (dolist (x load-path) (princ x) (terpri))
30 END_ELISP
32 my $ELISP_FIND_INFODIR = <<'END_ELISP';
33 (progn
34  (require (quote info))
35  (princ (car Info-default-directory-list)))
36 END_ELISP
38 my ($EMACS, $SITE_LISP, $INSTALL_INFO, $INFO_DIR, $HELP);
40 sub escape_path
42     my ($path) = @_;
43     $path =~ s/([$?* ])/\\$1/g; # escape special characters
44     $path =~ s{/+$}{};          # remove trailing forward-slashes
45     return $path;
48 sub prompt_for_emacs
50     # try to compile and install Elisp files, but don't die if we can't.
51     my ($sysemacs) = grep { defined && -x }
52         $ENV{EMACS}, glob '/usr/bin{/local,}/emacs';
53     $sysemacs ||= q{emacs};
55     my $emacs = prompt("Where is your emacs? ", $sysemacs);
57     # Make sure emacs is a valid string/program path...
58     return undef unless $emacs;
60     # Make sure -x is passed an absolute path...
61     unless ( $emacs =~ m{^/} && -x $emacs ) { 
62         warn "$emacs is not executable! Undefined.\n";
63         return undef;
64     }
66     return escape_path( $emacs );
69 # Runs some elisp code with emacs via the command line.
70 # We must set $EMACS before running this... if it is an untrue value
71 # then we return an empty list or string, depending on what caller wants.
72 sub run_elisp
74     my ($elisp) = @_;
76     return wantarray ? qw// : q{} unless $EMACS;
77     return `$EMACS --batch --eval '$elisp' 2>/dev/null`;
80 sub prompt_for_sitelisp
82     my @lp = run_elisp( $ELISP_FIND_SITELISP );
83     chomp @lp;
85     my $site_lisp;
86     if ( scalar @lp ) {
87         ($site_lisp) = grep { /site-lisp$/ && -d $_ } @lp;
88     }
90     $site_lisp = prompt("Elisp install directory?", $site_lisp);
92     # We don't check if the directory exists, because we can create it...
93     return escape_path( $site_lisp );
96 sub prompt_for_infodir
98     my $info_dir = run_elisp( $ELISP_FIND_INFODIR );
99     chomp $info_dir;
101     # pass prompt undef so it will not display brackets if $info_dir is ""
102     $info_dir = prompt("Info directory?", $info_dir || undef);
103     return escape_path( $info_dir );
106 # Append info page and elisp installation to the end of the install
107 # section in the Makefile...
109 sub MY::postamble
111     my $maketxt = <<"END_MAKETXT";
112 install ::
113 END_MAKETXT
115     if ( $INFO_DIR ) { $maketxt .= <<"END_MAKETXT" }
116         install -d -m755 \$(DESTDIR)$INFO_DIR
117         install -m644 sepia.info \$(DESTDIR)$INFO_DIR
118         $INSTALL_INFO \$(DESTDIR)$INFO_DIR/sepia.info \$(DESTDIR)$INFO_DIR/dir
119         
120 END_MAKETXT
122     if ( $SITE_LISP ) {
123         $maketxt .= <<"END_MAKETXT"
124         install -d -m755 \$(DESTDIR)$SITE_LISP
125         install -m644 *.el *.elc \$(DESTDIR)$SITE_LISP
126 END_MAKETXT
127     } else {
128         print <<'END_MSG'
130 ======================================================================
131 To actually use this package, you need to move the Emacs Lisp files
132 somewhere Emacs will find them.
134 You may also want to install the HTML documentation somewhere
135 appropriate to your system.
136 ======================================================================
138 END_MSG
139     }
141     # Create a new target for compiled elisp (.elc) files...
142     # Allow the compilation to fail (it is prefixed with "-")...
143     if ( $EMACS ) {
144         $maketxt .= <<"EOS";
146 \%.elc : \%.el
147         - $EMACS -L '$ENV{PWD}' --batch -f batch-byte-compile \$? 2>/dev/null
149 all :: sepia-snippet.elc sepia.elc sepia-cpan.elc sepia-tree.elc \\
150            sepia-w3m.elc sepia-ido.elc
152     }
154     return $maketxt;
157 GetOptions( 'emacs=s' => \$EMACS,
158             'lisp=s'  => \$SITE_LISP,
159             'info=s'  => \$INFO_DIR,
160             'help'    => \$HELP,
161            );
163 exit pod2usage( '-verbose' => 1 ) if $HELP;
165 test_for 'Devel::Peek', 'Printing internals requires Devel::Peek';
166 test_for 'Devel::Size', 'Printing variable sizes requires Devel::Size';
167 test_for 'IO::Scalar', 'Printing internals requires IO::Scalar because Devel::Peek sucks';
168 test_for 'Lexical::Persistence', 'Strict mode requires Lexical::Persistence';
169 test_for 'LWP::Simple', 'CPAN documentation browsing requires LWP::Simple';
170 test_for 'Module::CoreList', 'sepia-core-version requires Module::CoreList';
171 test_for 'Module::Info', 'Required for some Emacs functions';
172 test_for 'PadWalker', 'Stack/lexical inspection requires PadWalker >= 1.0';
173 test_for 'BSD::Resource', 'Detailed command timing';
174 test_for 'Time::HiRes', 'Basic command timing';
175 # test_for 'Pod::Webserver', 'Pod::Webserver creates nice documentation.';
176 # test_for 'Scope::Upper', 'Required for return-from-context';
178 $INSTALL_INFO = 'install-info';
180 $EMACS        ||= prompt_for_emacs()
181     or warn "Disabling elisp compilation and dir detection.\n";
182 $SITE_LISP    ||= prompt_for_sitelisp();
183 $INFO_DIR     ||= prompt_for_infodir();
184 $INSTALL_INFO ||= prompt("install-info program?", 'install-info')
185     if $INFO_DIR;
187 WriteMakefile(
188     NAME                => 'Sepia',
189     VERSION_FROM        => 'lib/Sepia.pm', # finds $VERSION
190     PREREQ_PM           => \%prereq,
191     EXE_FILES           => ['sepl'],
192     AUTHOR              => "Sean O'Rourke <seano\@cpan.org>",
193     ABSTRACT            => 'Simple Emacs-Perl InterAction',
194     clean           => { FILES => '*.elc' },
197 __END__
199 =head1 SYNOPSIS
201   # prompts for paths
202   perl Makefile.PL 
203   
204   # doesn't prompt for paths
205   perl Makefile.PL --emacs /usr/bin/emacs \
206       --lisp /usr/share/emacs/site-lisp/sepia \
207       --info /usr/share/info
209 =head1 OPTIONS
211 =over 4
213 =item B<--emacs>
215 Specifies the path to emacs.
217 =item B<--lisp>
219 Specifies the directory to install the elisp files to.
221 =item B<--info>
223 Specifies the directory to install the texinfo files to.
225 =item B<--help>
227 Display this help information.
229 =back