# -*- 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 68512 2010-06-05 09:04:58Z easieste@macports.org $

PortSystem  1.0

name        slime
version     20100504
epoch       20100504
revision    0
categories  lang
platforms   darwin
maintainers easieste

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
}

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

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

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

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

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

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


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

set slime_emacs_binary ""
set slime_site_lisp_dir "${destroot}${prefix}/share/emacs/site-lisp/slime"
set slime_site_lisp_contrib_dir "${slime_site_lisp_dir}/contrib"
set slime_byte_compile_p 0

configure {
    set slime_emacs_binary [
       if { [ variant_isset app ]
            || [regexp carbon [join [registry_installed emacs]]] } {
           list "${applications_dir}/Emacs.app/Contents/MacOS/Emacs"
       } else {
           list "${prefix}/bin/emacs"
       }
    ]

    set slime_byte_compile_p   0

    # Byte compiling doesn't seem to be working
    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 the Elisp files."
      } else {
          set slime_byte_compile_p 1
#          ui_msg "Emacs binary used for byte compilation is ${slime_emacs_binary}."
      }

    # Comment next line out to try byte compilation
    set slime_byte_compile_p 0
}

build {
    if { ${slime_byte_compile_p} } {
        system "cd ${worksrcpath} && ${slime_emacs_binary} \
                --batch  \
                --directory ${worksrcpath}  \
                --directory ${worksrcpath}/contrib \
                --funcall batch-byte-compile \
                contrib/*.el"
        system "cd ${worksrcpath} && ${slime_emacs_binary} \
                --batch  \
                --directory ${worksrcpath}  \
                --directory ${worksrcpath}/contrib \
                --funcall batch-byte-compile \
                *.el"
    }
    system "cd ${worksrcpath}/doc && make slime.info"
}

destroot    {
    xinstall -W ${worksrcpath} -m 755 -d ${slime_site_lisp_dir}

    foreach file [glob *.el *.elc *.lisp ChangeLog] {
        xinstall -W ${worksrcpath} -m 644 ${file} ${slime_site_lisp_dir}
    }

    xinstall -W ${worksrcpath}/contrib -m 755 -d ${slime_site_lisp_contrib_dir}

    foreach file [glob *.el *.elc *.lisp ChangeLog] {
        xinstall -W ${worksrcpath}/contrib -m 644 ${file} ${slime_site_lisp_contrib_dir}
    }

    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,  'sbcl', 'abcl', 'ccl',"
    ui_msg "'ecl' and 'clisp' all work.  As a convenience, port variants for SLIME"
    ui_msg "exist which require the installation of these Lisps."
    ui_msg ""
    ui_msg "Then put the following in your ~/.emacs:"
    ui_msg ""
    ui_msg "(add-to-list 'load-path \"${prefix}/share/emacs/site-lisp/slime\")"
    ui_msg "(require 'slime-autoloads)"
    ui_msg "(setq slime-lisp-implementations"
    ui_msg "     \`((sbcl (\"${prefix}/bin/sbcl\"))"
    ui_msg "       (abcl (\"${prefix}/bin/abcl\"))"
    ui_msg "       (clisp (\"${prefix}/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 ""
}


