# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=tcl:et:sw=4:ts=4:sts=4
# $Id: Portfile 24798 2007-05-04 17:37:59Z pipping@macports.org $

PortSystem  1.0

name        slime
version     20080216
epoch       20080216
categories  lang
platforms   darwin
maintainers evenson@panix.com

description An Emacs mode for unifying Common Lisp development

long_description    \
    SLIME extends Emacs with new support for interactive \
    programming in Common Lisp. The features are \
    centred around `slime-mode', an Emacs minor-mode \
    that complements the standard `lisp-mode'. While \
    `lisp-mode' supports editing Lisp source files, \
    `slime-mode' adds support for interacting with a \
    running Common Lisp process for compilation,\
    debugging, documentation lookup, and so on. 

homepage        http://common-lisp.net/project/slime/   
master_sites    ${homepage}
fetch.type      cvs
cvs.root        :pserver:anonymous@common-lisp.net:/project/slime/cvsroot
cvs.module      slime
cvs.password    anonymous
cvs.date        ${version}
worksrcdir      slime

use_configure   no
depends_lib     port:emacs

variant app description "Build SLIME against editors/emacs-app" { 
    depends_run-append port:emacs-app
    depends_run-delete port:emacs
    depends_lib-append port:emacs-app
    depends_lib-delete port:emacs
}

default_variants +sbcl

variant sbcl description "Require lang/sbcl for SLIME" {
    depends_run-append port:sbcl
}

variant openmcl description "Require lang/openmcl for SLIME" { 
    depends_run-append port:openmcl
}

variant clisp description "Require lang/clisp for SLIME" { 
    depends_run-append port:clisp
}

post-patch { 
    reinplace "s|/usr/local|${prefix}/share|g" \
        ${worksrcpath}/doc/makefile
}

configure { 
    global slime_emacs_binary
    global slime_site_lisp_dest
    global slime_site_lisp_contrib
    global slime_byte_compile_p
    global slime_site_lisp_dest_contrib
    if {[ variant_isset app ]} {
        set slime_emacs_binary /Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs 
    } else {
        # kludge if 'emacs+carbon' is installed
        if {[regexp carbon [join [registry_installed emacs]]]} {
            set slime_emacs_binary /Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs
        } else {
            set slime_emacs_binary ${prefix}/bin/emacs
        }
    }
    set slime_site_lisp_dest ${destroot}${prefix}/share/emacs/site-lisp/slime
    set slime_site_lisp_contrib ${prefix}/share/emacs/site-lisp/contrib

    set slime_site_lisp_dest_contrib ${slime_site_lisp_dest}/contrib
    

   if {! [file executable ${slime_emacs_binary}]} {
       set slime_byte_compile_p 0
       ui_msg "Couldn't find an executable Emacs image so won't byte compile."
   } else {
       set slime_byte_compile_p 1
       ui_msg "Emacs binary used for byte compilation is ${slime_emacs_binary}"
   }
}
            
build { 
    cd ${worksrcpath}
    upvar #0 slime_emacs_binary emacs_bin
    if {${slime_byte_compile_p}} {
        system "${emacs_bin} \
              --batch  --directory .  --funcall batch-byte-compile \
              slime.el \
              slime-autoloads.el \
              hyperspec.el"         

        cd ${worksrcpath}/contrib
        system "${emacs_bin} \
              --batch \
              --directory .  --directory .. \
              --funcall batch-byte-compile  \
              bridge.el \
              inferior-slime.el \
              slime-asdf.el \
              slime-parse.el \
              slime-autodoc.el \
              slime-banner.el \
              slime-c-p-c.el \
              slime-editing-commands.el \
              slime-fancy-inspector.el \
              slime-fancy.el \
              slime-fuzzy.el \
              slime-highlight-edits.el \
              slime-indentation.el \
              slime-motd.el \
              slime-parse.el \
              slime-presentation-streams.el \
              slime-presentations.el \
              slime-references.el \
              slime-scheme.el \
              slime-scratch.el \
              slime-tramp.el \
              slime-typeout-frame.el \
              slime-xref-browser.el"
    }

    cd ${worksrcpath}/doc
    system "make slime.info"
}

destroot    { 
    cd ${worksrcpath}
    xinstall -m 755 -d ${slime_site_lisp_dest}
    
    foreach file [glob *.el *.elc *.lisp ChangeLog] {
        xinstall -m 644 ${file} ${slime_site_lisp_dest}
    }

    cd ${worksrcpath}/contrib
    xinstall -m 755 -d ${slime_site_lisp_dest_contrib}
    foreach file [glob *.el *.elc *.lisp ChangeLog] {
        xinstall -m 644 ${file} ${slime_site_lisp_dest_contrib}
    }
          
    xinstall -m 644 ${worksrcpath}/doc/slime.info ${destroot}${prefix}/share/info  
}

post-activate   { 
    ui_msg "To use SLIME, you need to have a Common Lisp installed with which"
    ui_msg "you wish to interact.  At the moment, 'openmcl', 'sbcl', and"
    ui_msg "'clisp' all work. By default, MacPorts SLIME installs 'sbcl' as a"
    ui_msg "dependency."
    ui_msg ""
    ui_msg "Then put the following in your ~/.emacs:"
    ui_msg ""
    ui_msg "(require 'slime-autoloads)"
    ui_msg "(setq slime-lisp-implementations"
    ui_msg "     \`((sbcl (\"/opt/local/bin/sbcl\"))"
    ui_msg "       (clisp (\"/opt/local/bin/clisp\"))))"
    ui_msg "(add-hook \'lisp-mode-hook"
    ui_msg "           (lambda ()"
    ui_msg "             (cond ((not (featurep \'slime))"
    ui_msg "                    (require \'slime) "
	ui_msg	"                    (normal-mode)))))"
    ui_msg ""
    ui_msg "(eval-after-load \"slime\""
    ui_msg "   \'(slime-setup '(slime-fancy slime-banner)))"
    ui_msg ""
    ui_msg "Populate the initialization list in SLIME-LISP-IMPLEMENTATIONS" 
    ui_msg "with the correct paths to the Common Lisp exectuables you wish to use."
    ui_msg ""
    ui_msg "Then, 'M-x slime' from Emacs should connect you to the first"
    ui_msg "CL implementation in the list. 'C-- M-x slime' will present"
    ui_msg "an interactive chooser for additional implementations in the list."
    ui_msg ""
}



