Rakefile multiplataforma para erlang
Los últimos días estuve programando un toque en Erlang. Como estoy tratando de armar un proyectito algo más en serio, necesito algo como un makefile. Y como los makefiles son un dolor de huevos, decidí que es mejor hacer un rakefile.
Para eso estuve googleando un poco y encontré este post. Que casi resolvía los quilombos, pero le falta poder andar en Windows. Así que lo toquetié un poco para hacerlo multiplataforma.
Las cosas que tuve que hacer son:
- Usar ruby en vez de llamar a pwd para obtener el path actual.
- Generar nombres de archivos con back-slashes.
- Hacer que maneje bien cosas con espacios.
PWD = Pathname(".").realpath
Para que el Pathname fuera con backslashes, después de consultarlo con Luis Lavena, monkey-patchié Pathname para que el to_s mande "back-slashes":
#Hack to generate paths with back-slashes
class Pathname
alias_method :old_to_s, :to_s
def to_s
File::ALT_SEPARATOR ? old_to_s.gsub(File::SEPARATOR,File::ALT_SEPARATOR) : old_to_s
end
end
Por último, cambié un toque las llamadas a "sh" para que maneje paths con espacios. Para eso, en vez de pasarle un String le paso un Array por parámetro. Las llamadas quedaron algo así:
sh *%W{erl -switch param1 #{param_calculado}}
Al final, el Rakefile quedó así:
#Based on the Rakefile shown in http://medevyoujane.com/blog/2008/8/21/erlang-make-rake-and-emake.html
require 'rake'
require 'rake/clean'
require 'pathname'
#Hack to generate paths with back-slashes
class Pathname
alias_method :old_to_s, :to_s
def to_s
File::ALT_SEPARATOR ? old_to_s.gsub(File::SEPARATOR,File::ALT_SEPARATOR) : old_to_s
end
end
# Configuration
START_MODULE = "hellman"
TEST_MODULE = "TEST MODULE NOT DEFINED"
# No Need to change
PWD = Pathname(".").realpath
INCLUDE = "include"
ERLC_FLAGS = "-I#{INCLUDE} +warn_unused_vars +warn_unused_import"
SRC = FileList['src/**/*.erl']
OBJ = SRC.pathmap("%{src,ebin}X.beam")
CLEAN.include(['**/*.dump'])
CLOBBER.include(['**/*.beam'])
directory 'ebin'
rule ".beam" => ["%{ebin,src}X.erl"] do |t|
sh *%W{erlc -pa ebin -W #{ERLC_FLAGS} -o ebin #{t.source}}
end
desc "Compile all"
task :compile => ['ebin'] + OBJ
desc "Open up a shell"
task :shell => [:compile] do
sh *%W{erl -sname #{START_MODULE} -pa #{PWD + 'ebin'}}
end
desc "Open up a shell and run #{START_MODULE}:start()"
task :run => [:compile] do
sh *%W{erl -sname #{START_MODULE} -pa #{PWD + 'ebin'} -run #{START_MODULE} start}
end
desc "Run Unit Tests"
task :test do
sh *%W{erl -noshell -s #{TEST_MODULE} test -s init stop}
end
task :default => :compile
Happy jakin,
Aureliano.