Archive

HowTo: Compilando crystal en Fedora 22

Me ha interesado mucho el lenguaje de programación crystal: http://crystal-lang.org/.

Este lenguaje tiene la sintaxis muy parecida a Ruby; si no es que igual. Parece que hasta el Matzu; creador de Ruby, es fan del proyecto.

En todo caso, para compilarlo en Fedora, hice un script. El script aplica un parche.

Mi recomendación es crear un directorio temporal. Yo voy a usar /home/renich/Desktop/crystal:

Ahí voy a poner mi parche: bdw-gc-temporary_static_link.patch

--- a/src/gc/boehm.cr
+++ b/src/gc/boehm.cr
@@ -1,5 +1,5 @@
 @[Link("pthread")]
-@[Link("gc")]
+@[Link(ldflags: "-Wl,-Bstatic -lgc -Wl,-Bdynamic")]
 lib LibGC
   fun init = GC_init
   fun malloc = GC_malloc(size : UInt32) : Void*

Luego, mi script: do

#!/usr/bin/env bash
# pre-requisites
case $( cat /etc/*release | grep -oiEm 1 'fedora|debian|ubuntu' | awk '{print tolower($0)}' ) in
fedora)
    echo 'installing prerequisites for Fedora... '
    sudo dnf -y install libxml2-devel gmp-devel libevent-devel pcl-devel pcllib-devel gc-devel libunwind-devel libbsd-devel libyaml-devel readline-devel libedit-devel llvm-static
    ;;
debian|ubuntu)
    echo 'installing prerequisites for Debian or Ubuntu... '
    sudo apt-get install libbsd-dev libedit-dev libevent-core-2.0-5 libevent-extra-2.0-5 libevent-openssl-2.0-5 libevent-pthreads-2.0-5 libevent-dev libgc-dev libpcl1 libpcl1-dev libunwind8 libunwind8-dev libgmpxx4ldbl libgmp-dev libxml2-dev libyaml-dev readline-dev
    ;;
*)
    echo "
    I'm sorry. Your OS is not supported by this script. Please, visit:
    https://github.com/manastech/crystal/wiki/All-required-libraries

    And devise which dependencies you need and expand this script. It is easy enough ;).
    "

    exit 1
    ;;
esac

# settings
path=$( mktemp -d )
scriptpath=$( readlink -f $( dirname $0 ) )
os='linux'
arch='x86_64'
version='0.7.7'
release='1'

# env
export PATH="${path}/crystal-${version}-${release}/bin:${PATH}"
export LIBRARY_PATH="${path}/crystal-${version}-${release}/embedded/lib"

## tell me where you're working in
echo "working in $path"

# generate tmp dir
cd $path

# get source code
git clone git@github.com:manastech/crystal.git

## change into latest release
cd $path/crystal
git checkout $version

## patch
patch -p1 < $scriptpath/bdw-gc-temporary_static_link.patch || exit 1
cd $path

# get binary
curl -LO https://github.com/manastech/crystal/releases/download/${version}/crystal-${version}-${release}-${os}-${arch}.tar.gz

## uncompress
tar -xaf crystal-${version}-${release}-${os}-${arch}.tar.gz

# build
## cleanup
cd $path/crystal
rm -fr .crystal
make clean

## build
make

# install
sudo install -o root -g root -m 755 -p  $path/crystal/.build/crystal /usr/local/bin/

Luego, para compilar, solo corres el script. Yo lo puse en un archivo llamado 'do':

chmod 700 ./do
./do

El script creará un directorio temporal en /tmp y hará todo el merequetengue ahí. Al final, se instalará en /usr/local/bin.

Así, crystal estará en tu path y podrás jugar con él!

Al principio del script, está la información de versión y release. Para actualizar tu crystal, solo pon la versión que quieras compilar; basado en los releases de su página de github: https://github.com/manastech/crystal. Al momento de escribir este artículo, estoy usando la versión: 0.7.7

Para mayor referencia de mi script, visita el siguiente issue: https://github.com/manastech/crystal/issues/1382