A journey to find those pieces of software or technology that facilitate productive and maintainable software development

Thursday, March 26, 2009

Erlang R13A for MacPorts

UPDATE: Just selfupdate MacPorts if it isn't showing R12B (which is now released) and update erlang instead.

UPDATE: I have rewritten this article after reading Jim's comment on how to set up a local MacPorts repository.

Since there is not yet a Portfile for Erlang R13A in MacPorts I built one myself. MacPorts makes this remarkably easy since the Portfile format is so easy to read and write.

Save the following as ~/Desktop/Portfile:

# $Id$

PortSystem 1.0
name  erlang
version  R13A
revision        1
categories lang erlang
maintainers gmail.com:alain.odea
platforms darwin
description The Erlang Programming Language
long_description                                                        \
                Erlang is a programming language designed at the        \
                Ericsson Computer Science Laboratory. Open-source       \
                Erlang is being released to help encourage the spread   \
                of Erlang outside Ericsson.                             \
                                                                        \
                We are releasing free of charge:                        \
                    The entire source code of the current Erlang        \
                    system.                                             \
                    Extensive libraries of code for building robust     \
                    fault-tolerant distributed applications.            \
                    All with documentation.                             \
                                                                        \
                All the above software has been battle tested in a      \
                number of Ericsson products, for example the new        \
                Ericsson ATM switch. 

homepage        http://www.erlang.org/
master_sites    http://www.erlang.org/download/                         \
                http://www3.erlang.org/download/                        \
                http://www.csd.uu.se/ftp/mirror/erlang/download/        \
                http://www1.erlang.org/download/
                

distfiles       otp_src_${version}${extract.suffix}                    \
                otp_doc_man_${version}${extract.suffix}                \
                otp_doc_html_${version}${extract.suffix}

checksums       otp_src_R13A.tar.gz \
                    md5     76804ff9c18710184cf0c0230a0443fc \
                    sha1    9fa0db27611559d697fe269c3fb9a405ae24d147 \
                    rmd160  42ba3c4815fa702d19281f1d42faaec72a75c703 \
                otp_doc_man_R13A.tar.gz \
                    md5     883e097796abd2cda4727fe3527dc1b6 \
                    sha1    98ce2fbc2daf7ec88ca38334412b9e85ca9cd53c \
                    rmd160  c082bda26b85cd6bd2ede8dd2c538e2ef50bbd2c \
                otp_doc_html_R13A.tar.gz \
                    md5     2bbecc1c5537e0cd1c0fc406082b6c56 \
                    sha1    fb3ed9c0d619d8bbd70af5c6b0e4e90c49771e0d \
                    rmd160  873b30cd8c5f2617c62aba0314197c54097a27cf

extract.only    otp_src_${version}${extract.suffix}

pre-patch       { file rename ${workpath}/otp_src_${version} ${workpath}/${name}-${version} }

# http://www.erlang.org/pipermail/erlang-bugs/2008-October/001023.html
# http://www.erlang.org/pipermail/erlang-bugs/2008-October/001024.html
# http://support.process-one.net/browse/EUNIT-13
patchfiles patch-toolbar.erl \
                patch-erts_emulator_Makefile.in \
                patch-lib_ssl_c_src_esock_openssl.c \
                patch-lib_ssl_c_src_Makefile.dist \
                patch-lib_ssl_c_src_Makefile.in \
                patch-decode_big.c.diff \
                patch-decode_fun.c.diff \
                patch-eunit_xml.diff

configure.args  --prefix=${destroot}${prefix} \
                --enable-kernel-poll            \
                --disable-smp-support           \
                --enable-hipe

variant smp description {enable symmetric multiprocessing} {
 configure.args-delete --disable-smp-support
}

variant ssl description {enable SSL/TLS encryption} {
 configure.args-append    --with-ssl=${prefix}
 configure.ldflags-append -lz
 depends_build-append     port:openssl
 depends_run-append       port:openssl
}

variant no_hipe description {disable HiPE native compilation support} {
 # Currently produces bus errors in 10.5.3 due to changes in
 # signal handling
 configure.args-delete   --enable-hipe
}


platform i386 {
   pre-configure {
      file copy ${filespath}/mach_override.h ${workpath}/${name}-${version}/erts/emulator/hipe
      file copy ${filespath}/mach_override.c ${workpath}/${name}-${version}/erts/emulator/hipe
   }
}



depends_build   port:gawk \
                port:wxWidgets
depends_run     port:tk

post-destroot {
 system "tar -C ${destroot}${prefix}/lib/erlang -zxvf ${distpath}/otp_doc_html_${version}${extract.suffix}"
 system "tar -C ${destroot}${prefix}/lib/erlang -zxvf ${distpath}/otp_doc_man_${version}${extract.suffix}"
 
        set erts_dir   erts-5.7

        reinplace s|${destroot}|| ${destroot}${prefix}/lib/erlang/bin/erl
        reinplace s|${destroot}|| ${destroot}${prefix}/lib/erlang/bin/start
        reinplace s|${destroot}|| ${destroot}${prefix}/lib/erlang/${erts_dir}/bin/erl
        reinplace s|${destroot}|| ${destroot}${prefix}/lib/erlang/${erts_dir}/bin/start

 foreach x {dialyzer ear ecc elink epmd erl erlc escript run_erl start to_erl typer} { file delete -force ${destroot}${prefix}/bin/${x} }
 foreach x {dialyzer erl erlc escript run_erl start to_erl typer} { system "ln -s ../lib/erlang/bin/${x} ${destroot}${prefix}/bin/${x}" }

 file delete -force ${destroot}${prefix}/lib/erlang/bin/epmd
 system "ln -s ../${erts_dir}/bin/epmd ${destroot}${prefix}/lib/erlang/bin/epmd"
}

Save the following script to ~/Desktop/mkerlangport.sh:

#!/usr/bin/env bash
macports_repo=/opt/local/var/macports/sources/rsync.macports.org
local_repo=/opt/local/var/macports/sources/local
sources=/opt/local/etc/macports/sources.conf
port=lang/erlang
cat ${sources} | grep file://${local_repo} > /dev/null
if [ ! $? ]
then
    tmpfile=`mktemp -t sources.conf`
    cat ${sources} > ${tmpfile}
    echo "file://${local_repo} [nosync]" | cat ${tmpfile} > ${sources}
fi
mkdir -p ${local_repo}/${port}/files
cp ${macports_repo}/release/ports/${port}/files/* ${local_repo}/${port}/files
cp ~/Desktop/Portfile ${local_repo}/${port}/Portfile
portindex ${local_repo}

Run this script in terminal as sudo bash ~/Desktop/mkerlangport.sh. It should report

Creating software index in /opt/local/var/macports/sources/local
Adding port lang/erlang

Total number of ports parsed: 1 
Ports successfully parsed: 1  
Ports failed:   0

Once you have created the Portfile and installed it as instructed above you can sudo port install erlang @R13A +smp +ssl to get R13A. If you have R12B already installed you should sudo port deactivate erlang first. I am not sure if upgrade works since I haven't tried it.

4 comments:

Unknown said...

Ack!

Do not overwrite the rsync.macports.com portfile! Create your own local repository. Add the following line to /opt/local/etc/macports/sources.conf ahead of the rsync line:

file:///opt/local/var/macports/sources/local/ [nosync]

and then do the following:

mkdir -p /opt/local/var/macports/sources/local/lang/erlang/files

cp /opt/local/var/macports/sources/rsync.macports.org/release/ports/lang/erlang/files/* /opt/local/var/macports/sources/local/lang/erlang/files

cp [erlangR13A-portfile-path] /opt/local/var/macports/sources/local/lang/erlang

portindex /opt/local/var/macports/source/local


You will now be able to do the port upgrade and when the macports tree updates with a new version you will not have your changes stomped on by the new portfile. You can also now start using your local macports repositry to create portfiles for projects that are not currently in macports (I do this for a lot of erlang projects that are out there) or create your own variations to existing ports.

Unknown said...

@Jim:

I cannot MacPorts to install R13A now. It keeps installing R12B even when I specify the version in the install command as install erlang @R13A +smp +ssl.

When I run info erlang from the port shell I get the following output:

Warning: Found 2 port erlang definitions, displaying first one.
erlang @R12B-5, Revision 1 (lang, erlang)
Variants: i386, no-hipe, smp, ssl, universal

Erlang is a programming language designed at the Ericsson Computer Science
Laboratory. Open-source Erlang is being released to help encourage the spread of
Erlang outside Ericsson. We are releasing free of charge: The entire source code
of the current Erlang system. Extensive libraries of code for building robust
fault-tolerant distributed applications. All with documentation. All the above
software has been battle tested in a number of Ericsson products, for example
the new Ericsson ATM switch.
Homepage: http://www.erlang.org/

Build Dependencies: gawk
Runtime Dependencies: tk
Platforms: darwin
Maintainers: bfulgham@macports.org


I know I am doing something silly. Is there a simple way to fix this? I would rename my Erlang port to erlang_exp to disambiguate it, but I am worried that will cause weirdness since it installs to the same place as the erlang port.

Unknown said...

I figured it out. The order of sources defines the precedence of ports chosen if duplicates exist. Putting the local source second means (in this case) that its ports will never be installable. Putting it at the top of the file works.

nem said...

I have a slightly different portfile at github that supports hipe (with 32bit erlang - working on patches for 64 bit), working ssl, odbc etc.

The 64bit variant currently produces a working erlang, but wx (and possibly some other libs) doesn't compile properly.

SyntaxHighlighter