1 # uncomment for development
8 use ExtUtils::MakeMaker qw(WriteMakefile prompt);
9 use 5.006; # for "no warnings" -- sorry!
10 # See lib/ExtUtils/MakeMaker.pm for details of how to influence
11 # the contents of the Makefile that is written.
18 ## Poor man's optional deps.
24 my $resp = prompt("@_. Install $mod (y/n)? ", 'n');
25 $prereq{$mod} = 0 if $resp =~ /^y/i;
29 my $ELISP_FIND_SITELISP = <<'END_ELISP';
30 (dolist (x load-path) (princ x) (terpri))
33 my $ELISP_FIND_INFODIR = <<'END_ELISP';
35 (require (quote info))
36 (princ (car Info-default-directory-list)))
39 my ($EMACS, $SITE_LISP, $INSTALL_INFO, $INFO_DIR, $HELP);
44 $path =~ s/([$?* ])/\\$1/g; # escape special characters
45 $path =~ s{/+$}{}; # remove trailing forward-slashes
51 # try to compile and install Elisp files, but don't die if we can't.
52 my ($sysemacs) = grep { defined && -x }
53 $ENV{EMACS}, glob '/usr/bin{/local,}/emacs';
54 $sysemacs ||= q{emacs};
56 my $emacs = prompt("Where is your emacs? ", $sysemacs);
58 # Make sure emacs is a valid string/program path...
59 return undef unless $emacs;
61 # Make sure -x is passed an absolute path...
62 unless ( $emacs =~ m{^/} && -x $emacs ) {
63 warn "$emacs is not executable! Undefined.\n";
67 return escape_path( $emacs );
70 # Runs some elisp code with emacs via the command line.
71 # We must set $EMACS before running this... if it is an untrue value
72 # then we return an empty list or string, depending on what caller wants.
77 return wantarray ? qw// : q{} unless $EMACS;
78 return `$EMACS --batch --eval '$elisp' 2>/dev/null`;
81 sub prompt_for_sitelisp
83 my @lp = run_elisp( $ELISP_FIND_SITELISP );
88 ($site_lisp) = grep { /site-lisp$/ && -d $_ } @lp;
91 $site_lisp = prompt("Elisp install directory?", $site_lisp);
93 # We don't check if the directory exists, because we can create it...
94 return escape_path( $site_lisp );
97 sub prompt_for_infodir
99 chomp(my @info_dir = grep { m!/info/?$! } run_elisp( $ELISP_FIND_INFODIR ));
101 # pass prompt undef so it will not display brackets if $info_dir is ""
102 my $info_dir = prompt("Info directory?", $info_dir[0] || 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 # Make an entry for Sepia.html as a target to make things easier...
112 my $maketxt = <<'END_MAKETXT';
113 all :: Sepia.html sepia.info
115 Sepia.html : sepia.texi
116 makeinfo --no-split --no-headers --html sepia.texi -o Sepia.html
118 sepia.info : sepia.texi
119 makeinfo --no-split -o sepia.info sepia.texi
123 $maketxt .= <<"END_MAKETXT";
127 if ( $INFO_DIR ) { $maketxt .= <<"END_MAKETXT" }
128 install -d -m755 \$(DESTDIR)$INFO_DIR
129 install -m644 sepia.info \$(DESTDIR)$INFO_DIR
130 $INSTALL_INFO \$(DESTDIR)$INFO_DIR/sepia.info \$(DESTDIR)$INFO_DIR/dir
135 $maketxt .= <<"END_MAKETXT";
136 install -d -m755 \$(DESTDIR)$SITE_LISP
137 install -m644 *.el \$(DESTDIR)$SITE_LISP
140 $maketxt .= <<"END_MAKETXT";
141 install -m644 *.elc \$(DESTDIR)$SITE_LISP
147 ======================================================================
148 To actually use this package, you need to move the Emacs Lisp files
149 somewhere Emacs will find them.
151 You may also want to install the HTML documentation somewhere
152 appropriate to your system.
153 ======================================================================
158 # Create a new target for compiled elisp (.elc) files...
159 # Allow the compilation to fail (it is prefixed with "-")...
164 - $EMACS -L '$ENV{PWD}' --batch -f batch-byte-compile \$? 2>/dev/null
166 all :: sepia-snippet.elc sepia.elc sepia-cpan.elc sepia-tree.elc \\
167 sepia-w3m.elc sepia-ido.elc
174 GetOptions( 'emacs=s' => \$EMACS,
175 'lisp=s' => \$SITE_LISP,
176 'info=s' => \$INFO_DIR,
180 exit pod2usage( '-verbose' => 1 ) if $HELP;
182 test_for 'Devel::Peek', 'Printing internals requires Devel::Peek';
183 test_for 'Devel::Size', 'Printing variable sizes requires Devel::Size';
184 test_for 'IO::Scalar', 'Printing internals requires IO::Scalar because Devel::Peek sucks';
185 test_for 'PadWalker', 'Strict mode requires PadWalker';
186 test_for 'Devel::LexAlias', 'Strict mode requires Devel::LexAlias';
187 test_for 'LWP::Simple', 'CPAN documentation browsing requires LWP::Simple';
188 test_for 'Module::CoreList', 'sepia-core-version requires Module::CoreList';
189 test_for 'Module::Info', 'Required for some Emacs functions';
190 test_for 'BSD::Resource', 'Detailed command timing';
191 test_for 'Time::HiRes', 'Basic command timing';
192 # test_for 'Pod::Webserver', 'Pod::Webserver creates nice documentation.';
193 # test_for 'Scope::Upper', 'Required for return-from-context';
195 $INSTALL_INFO = 'install-info';
197 if ( !defined $EMACS ) {
198 $EMACS = prompt_for_emacs()
199 or warn "Disabling elisp compilation and dir detection.\n";
201 $SITE_LISP ||= prompt_for_sitelisp();
202 $INFO_DIR ||= prompt_for_infodir();
203 $INSTALL_INFO ||= prompt("install-info program?", 'install-info')
208 VERSION_FROM => 'lib/Sepia.pm', # finds $VERSION
209 PREREQ_PM => \%prereq,
210 EXE_FILES => ['sepl'],
211 AUTHOR => "Sean O'Rourke <seano\@cpan.org>",
212 ABSTRACT => 'Simple Emacs-Perl InterAction',
213 clean => { FILES => '*.elc' },
223 # doesn't prompt for paths
224 perl Makefile.PL --emacs /usr/bin/emacs \
225 --lisp /usr/share/emacs/site-lisp/sepia \
226 --info /usr/share/info
234 Specifies the path to emacs.
238 Specifies the directory to install the elisp files to.
242 Specifies the directory to install the texinfo files to.
246 Display this help information.