mirror https://github.com/synrc/mad

Namdak Tonpa 36442e4c1c Update README.md 10 years ago
doc 135720e97f mad tex 10 years ago
include 95e4d5f320 livejournal post 10 years ago
priv b171e9653c typo 10 years ago
src 95e4d5f320 livejournal post 10 years ago
test fe1e953680 make mad regular OTP application back 11 years ago
.gitignore 856c7887f3 Get the escript to work 11 years ago
.travis.yml a391e95692 mad with no deps 11 years ago
LICENSE 431a4ee5c1 mad ling 10 years ago
Makefile ce72016ab0 fix error with ./mad up 10 years ago
README.md 36442e4c1c Update README.md 10 years ago
mad 95e4d5f320 livejournal post 10 years ago
mix.exs d2274768e5 https://hex.pm/packages/mad 10 years ago
rebar.config 95e4d5f320 livejournal post 10 years ago

README.md

MAD

A simple rebar-compatible dependency manager and developer tool with plugins.

MAD

Goals

It shall:

  • be compatible with rebar configuration.
  • be as small and fast as possible.

Features

  • Colorful REPL
  • Support rebar.config
  • Support OTP releases and directory structure
  • Fast deps resolving and cycles detecting
  • Fast compilation
  • DTL/YECC/LEEX/PORT/SCRIPT/APP/ERL compilation
  • BEAM bundles (single-file escriptized app)
  • LING bundles (single-file with built-in LING)
  • RELX release (relx dependency should be discarded)
  • Start/Stop/Attach
  • Static files generation with node.js tools
  • 9p server for remote access

Build

    $ make

And put mad to PATH.

BEAM Lightweight Unikernel Bundle

Bundle is a gzipped archive of erlang beams of all dependecies along with directory structure of OTP-applications with priv directories. This allows you to pack all site inside single portable escript package able to run under Windows, Linux and Mac. Releases includes all current directory exept sources both code and data with all dependencies. You may think of BEAM Lightweight Unikernel Bundle as of fixed Erlang releases.

    $ mad app "sample"
    $ cd sample
    $ mad deps compile plan bundle "web_app"
    $ ./web_app

LING Unikernel

Sample rebar.config for your application you want to go unikernel:

{deps_dir,"deps"}.
{deps, [{ling, ".*", {git, "git://github.com/proger/ling", {tag, "osx-again"}}},
        {sh, ".*",   {git, "git://github.com/synrc/sh",       {tag, "1.4"}}}]}.

Now you should build LING/posix:

    $ ./mad dep
    $ cd deps/ling
    $ ARCH=posix_x86 make

Now pack vmling.o, your OTP apps and rest static to single-file LING bundle with VM inside.

    $ ./mad lin
Ling Params: []
ARCH: posix_x86
Bundle Name: mad
System: [compiler,syntax_tools,sasl,tools,mnesia,reltool,xmerl,crypto,kernel,
         stdlib,wx,webtool,ssl,runtime_tools,public_key,observer,inets,asn1,
         et,eunit,hipe,os_mon]
Apps: [kernel,stdlib,sh,mad]
Overlay: ["crypto.beam","9p.beam","9p_auth.beam","9p_info.beam",
          "9p_mounter.beam","9p_server.beam","9p_tcp.beam","9p_zero.beam",
          "disk.beam","disk_server.beam","embedded_export.beam",
          "goo_export.beam","goofs.beam","hipe_unified_loader.beam",
          "inet_config.beam","kernel.beam","ling_bifs.beam","ling_code.beam",
          "ling_disasm.beam","ling_iops.beam","ling_iopvars.beam",
          "ling_lib.beam","net_vif.beam","os.beam","prim_file.beam",
          "user_drv.beam","os_mon.beam","dets.beam","filename.beam",
          "maps.beam","unicode.beam","zlib.beam"]
Bucks: [{boot,"/boot",2},
        {os_mon,"/erlang/lib/os_mon/ebin",1},
        {crypto,"/erlang/lib/crypto/ebin",1},
        {kernel,"/erlang/lib/kernel/ebin",90},
        {stdlib,"/erlang/lib/stdlib/ebin",85},
        {sh,"/erlang/lib/sh/ebin",6},
        {mad,"/erlang/lib/mad/ebin",43}]
Initializing EMBED.FS:
Mount View:
 /boot /boot
/erlang/lib/os_mon/ebin /os_mon
/erlang/lib/crypto/ebin /crypto
/erlang/lib/kernel/ebin /kernel
/erlang/lib/stdlib/ebin /stdlib
/erlang/lib/sh/ebin /sh
/erlang/lib/mad/ebin /mad
Creating EMBED.FS C file: ...ok
Compilation of Filesystem object: ...ok
Linking Image: ok

Run it:

$ rlwrap ./image.img
Erlang [ling-0.3.2]

Eshell V6.3  (abort with ^G)
1> application:which_applications().
[{mad,"MAD VXZ Build Tool","2.2"},
 {sh,"VXZ SH Executor","0.9"},
 {stdlib,"ERTS  CXC 138 10","2.2"},
 {kernel,"ERTS  CXC 138 10","3.0.3"}]

See details in http://maxim.livejournal.com/458016.html

Building OTP Release

Releases are bundles made by release_handler module of sasl applications. It has it own fat bootstripts along with erlang runtime included. This allows you to distribute you applications with copy deploy without Erlang prerequisite.

    $ mad app sample
    $ cd sample
    $ mad dep com pla release
    $ _rel/sample/bin/sample console

Note: relx must be installed LINUX NOTE: if you want to have online recompilation you should do at first:

    $ sudo apt-get install inotify-tools

Support

  • Gitter
  • IRC Channel #n2o on FreeNode 24/7

Documentation

If you are new or need to determine whether the MAD architecture and philosophy is a fit for your project

  • Official MAD brochure HTML and PDF

Credits

  • Maxim Sokhatsky
  • Sina Samavati
  • Vladimir Kirillov

OM A HUM