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.
17 ## Poor man's optional deps.
23 my $resp = prompt("@_. Install $mod (y/n)? ", 'n');
24 $prereq{$mod} = 0 if $resp =~ /^y/i;
28 my $ELISP_FIND_SITELISP = <<'END_ELISP';
29 (dolist (x load-path) (princ x) (terpri))
32 my $ELISP_FIND_INFODIR = <<'END_ELISP';
34 (require (quote info))
35 (princ (car Info-default-directory-list)))
38 my ($EMACS, $SITE_LISP, $INSTALL_INFO, $INFO_DIR, $HELP);
43 $path =~ s/([$?* ])/\\$1/g; # escape special characters
44 $path =~ s{/+$}{}; # remove trailing forward-slashes
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";
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.
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 );
87 ($site_lisp) = grep { /site-lisp$/ && -d $_ } @lp;
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 );
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...
111 my $maketxt = <<"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
123 $maketxt .= <<"END_MAKETXT"
124 install -d -m755 \$(DESTDIR)$SITE_LISP
125 install -m644 *.el *.elc \$(DESTDIR)$SITE_LISP
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 ======================================================================
141 # Create a new target for compiled elisp (.elc) files...
142 # Allow the compilation to fail (it is prefixed with "-")...
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
157 GetOptions( 'emacs=s' => \$EMACS,
158 'lisp=s' => \$SITE_LISP,
159 'info=s' => \$INFO_DIR,
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')
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' },
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
215 Specifies the path to emacs.
219 Specifies the directory to install the elisp files to.
223 Specifies the directory to install the texinfo files to.
227 Display this help information.