Wrap your application in a BEAM Burrito!

Overview

Burrito 🌯

Cross-Platform Elixir Deployments

What Is It?

Background

Burrito is our answer to the problem of distributing Elixir CLI applications across varied environments, where we cannot guarantee that the Erlang runtime is installed, and where we lack the permissions to install it ourselves. In particular, we have CLI tooling that must be deployed on-premise, by consultants, into customer environments that may be running MacOS, Linux, or Windows.

Furthermore, these tools depend on NIFs that we need to cross-compile for any of the environments that we support, from one common build server, running in our CI environment.

We were heavily inspired by Bakeware, which lays a lot of the ground work for our approach. Ultimately we implemented and expanded upon many of Bakeware's ideas using Zig.

Feature Overview

  • Builds a self-extracting archive for a Mix project, targeting Windows, MacOS, and Linux, containing:
    • Your compiled BEAM code
    • The required ERTS for your project
    • Compilation artifacts for any elixir-make based NIFs used by the project
  • Provides a "plugin" interface for injecting Zig code into your application's boot sequence
    • We use this to perform automatic updates and licensing checks (see lib/versions/release_file.ex for details)
  • Automatically uninstalls old versions of the payload if a new version is run.

Technical Component Overview

Burrito is composed of a few different components:

  • Mix Release Module - A module that is executed as a Mix release step. This module takes care of packing up the files, downloading and copying in different ERTS runtimes, and launching the Zig Archiver and Wrapper.
  • Zig Archiver - A small Zig library that packs up an entire directory into a tar-like blob. This is known as the "payload" -- which will contain all the compiled BEAM code for your release, and the ERTS for the target platform. This is Gzip compressed and then embedded directly into the wrapper program.
  • Zig Wrapper - This is portable cross-platform Zig code that wraps around the payload generated during the Mix release process.
      Burrito Produced Binary
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                β”‚
β”‚       Zig Wrapper Binary       β”‚ <---- Compiled from `wrapper.zig`
β”‚                                β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚        Payload Archive         β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚                            β”‚ β”‚
β”‚ β”‚    ERTS Native Binaries    β”‚ <------ If cross-compiling, this is downloaded from a build server
β”‚ β”‚                            β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                β”‚ <---- This bottom payload portion is generated by `archiver.zig`
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚                            β”‚ β”‚
β”‚ β”‚   Application BEAM Code    β”‚ β”‚
β”‚ β”‚                            β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

End To End Overview

  1. You build a Burrito wrapped binary of your application and send it to an end-user
  2. The end-user launches your binary like any other native application on their system
  3. In the background (first-run only) the payload is extracted into a well defined location on the system. (AppData, Application Support, etc.)
  4. The wrapper executes the Erlang runtime in the background, and transparently launches your application within the same process
  5. Subsequent runs of the same version of that application will use the previously extracted payload

Quick Start

Disclaimer

Burrito was built with our specific use case in mind, and while we've found success with deploying applications packaged using Burrito to a number of production environments, the approach we're taking is still experimental.

That being said, we're excited by our early use of the tooling, and are eager to accept community contributions that improve the reliability of Burrito, or that add support for additional platforms.

Preparation and Requirements

NOTE: Due to current limitations of Zig, some platforms are less suited as build machines than others: we've found the most success building from Linux and MacOS. The matrix below outlines which build targets are currently supported by each host.

Target Host Host Host Host
Windows x64 Linux MacOS (x86_64) MacOS (Apple Silicon)**
Windows x64 ❌ βœ… βœ… ❌
Linux ❌ βœ… βœ… ❌
MacOS (x86_64) ❌ ⚠️ * βœ… ❌
MacOS (Apple Silicon)** ❌ ⚠️ * βœ… βœ…

* NIFs implemented using elixir-make cannot be cross-compiled from Linux to MacOS, pending a proposed linker change in Zig

** Automated testing and building of Apple silicon Erlang builds is blocked on support for Apple Silicon in Github Actions.


You must have the following installed and in your PATH:

  • Zig (0.9.0) -- zig
  • XZ -- xz
  • 7z -- 7z (For Windows Targets)

Mix Project Setup

  1. Add burrito to your list of dependencies:
defp deps() do
  [{:burrito, github: "burrito-elixir/burrito"}]
end
  1. Create a releases function in your mix.exs, add and configure the following for your project:
  def releases do
  [
    example_cli_app: [
      steps: [:assemble, &Burrito.wrap/1],
      burrito: [
        targets: [
          macos: [os: :darwin, cpu: :x86_64],
          linux: [os: :linux, cpu: :x86_64],
          windows: [os: :windows, cpu: :x86_64]
        ],
      ]
    ]
  ]
  end

(See the Mix Release Config Options for additional options)

  1. To build a release for all the targets defined in your mix.exs file: MIX_ENV=prod mix release
  2. You can also build a single target by setting the BURRITO_TARGET environment variable to the alias for that target (e.g. Setting BURRITO_TARGET=macos builds only the macos target defined above.)

NOTE: In order to speed up iteration times during development, if the Mix environment is not set to prod, the binary will always extract its payload, even if that version of the application has already been unpacked on the target machine.

Mix Release Config Options

  • targets - A list of atoms, the targets you want to build for (:darwin, :win64, :linux, :linux_musl) whenever you run a mix release command -- if not defined, defaults to native host platform only.
  • debug - Boolean, will produce a debug build if set to true. (Default: false)
  • no_clean - Boolean, will not clean up after building if set to true. (Default: false)
  • plugin - String, a path to a Zig file that contains a function burrito_plugin_entry() which will be called before unpacking the payload at runtime. See the example application for details.

Build-Time Environment Variables

  • BURRITO_TARGET - Override the list of targets provided in your release configuration. (ex: BURRITO_TARGET=win64, BURRITO_TARGET=linux,darwin)

Application Entry Point

For Burrito to work properly you must define a :mod in your project's Mix config:

  def application do
    [
      mod: {MyEntryModule, []}
    ]
  end

This module must implement the callbacks defined by the Application module, as stated in the Mix documentation:

defmodule MyEntryModule do
  def start(_, _) do
   # Returning `{:ok, pid}` will prevent the application from halting.
   # Use System.halt(exit_code) to terminate the VM when required
  end
end

If you wish you retrieve the argv passed to your program by Burrito use this snippet:

 args = Burrito.Util.Args.get_arguments() # this returns a list of strings

Maintenance Commands

Binaries built by Burrito include a built-in set of commands for performing maintenance operations against the included application:

  • ./my-binary maintenance uninstall - Will prompt to uninstall the unpacked payload on the host machine.

Advanced Build Configuration

Build Steps and Phases

Burrito runs the mix release task in three "Phases". Each of these phases contains a number of "Steps", and a context struct containing the current state of the build, which is passed between each step.

The three phases of the Burrito build pipeline are:

  • Fetch - This phase is responsible for downloading or copying in any replacement ERTS builds for cross-build targets.
  • Patch - The patch phase injects custom scripts into the build directory, this phase is also where any custom files should be copied into the build directory before being archived.
  • Build - This is the final phase in the build flow, it produces the final wrapper binary with a payload embedded inside.

You can add your own steps before and after phases execute. Your custom steps will also receive the build context struct, and can return a modified one to customize a build to your liking.

An example of adding a step before the fetch phase, and after the build phase:

# ... mix.exs file
def releases do
  [
    my_app: [
      steps: [:assemble, &Burrito.wrap/1],
      burrito: [
        # ... other Burrito configuration
        extra_steps: [
          fetch: [pre: [MyCustomStepModule, AnotherCustomStepModule]],
          build: [post: [CustomStepAgain, YetAnotherCustomStepModule]]
        ]
      ]
    ]
  ]
end

You can override default steps or phases by setting the phases option.

If your build phase's requirements are different to Burrito's, specify your own assemble step that calls Burrito.Builder.build(release).

  # ... mix.exs file
  def releases do
    [
      my_app: [
        steps: [:assemble, &MyPojrect.wrap/1],
        burrito: [
          # ... other Burrito configuration
          phases: [
            build: [MyProject.CustomBuildStep1, MyProject.CustomBuildStep2]
          ]
        ]
      ]
    ]
  end
defmodule MyProject
  def wrap(%Mix.Relase{} = release) do
    pre_check(release)
    Burrito.Builder.build(release)
  end

  defp pre_check(release) do
    # checks specific to your build.
  end
end

Build Targets and Qualifiers

A Burrito build target is a keyword list that contains an operating system, a CPU architecture, and extra build options (called Qualifiers).

Here's a definition for a build target configured for Linux x86-64:

targets: [
  linux: [os: :linux, cpu: :x86_64]
]

Build targets can be further customized using build qualifiers. For example, a Linux build target can be configured to use musl instead of glibc using the following definition:

targets: [
  linux_musl: [
    os: :linux,
    cpu: :x86_64,
    libc: :musl
  ]
]

Build qualifiers are a simple way to pass specific flags into the Burrito build pipeline. Currently, only the libc and custom_erts qualifiers have any affect on the standard Burrito build phases and steps.

Tip: You can use these qualifiers as a way to pass per-target information into your custom build steps.

Using Custom ERTS Builds

The Burrito project provides precompiled builds of Erlang for the following platforms:

[os: :darwin, cpu: :x86_64],
[os: :linux, cpu: :x86_64, libc: :glibc], # or just [os: :linux, cpu: :x86_64]
[os: :linux, cpu: :x86_64, libc: :musl],
[os: :windows, cpu: :x86_64]

If you require a custom build of ERTS, you're able to override the precompiled binaries on a per target basis by setting custom_erts to the path of your ERTS build:

targets: [
  linux_arm: [
    os: :linux,
    cpu: :arm64,
    custom_erts: "/path/to/my_custom_erts.tar.gz"
  ]
]

The custom_erts value should be a path to a local .tar.gz of a release from the Erlang source tree. The structure inside the archive should mirror:

. (TAR Root)
└─ otp-A.B.C-OS-ARCH
  β”œβ”€ erts-X.Y.Z/
  β”œβ”€ releases/
  β”œβ”€ lib/
  β”œβ”€ misc/
  β”œβ”€ usr/
  └─ Install

You can easily build an archive like this by doing the following commands inside the (official Erlang source code)[https://github.com/erlang/otp]:

# configure and build Erlang as you require...
# ...

export RELEASE_ROOT=$(pwd)/release/otp-A.B.C-OS-ARCH
make release
cd release
tar czf my_custom_erts.tar.gz otp-A.B.C-OS-ARCH

Known Limitations and Issues

Runtime Requirements

Minimizing the runtime dependencies of the package binaries is an explicit design goal, and the requirements for each platform are as follows:

Windows
  • MSVC Runtime for the Erlang version you are shipping
  • Windows 10 Build 1511 or later (for ANSI color support)
Linux
  • Any distribution with glibc (or musl libc)
  • libncurses-5
MacOS
  • No runtime dependencies, however a security exemption must be set in MacOS Gatekeeper unless the binary undergoes codesigning

Contributing

Welcome!

We are happy to review and accept pull requests to improve Burrito, and ask that you follow the established code formatting present in the repo!

Everything in this repo is licensed under The MIT License, see LICENSE for the full license text.

Comments
  • Executable failed to run on win64: The system cannot find the path specified.

    Executable failed to run on win64: The system cannot find the path specified.

    I built executables for win64 and linux on Ubuntu, the native (linux) one can run successfully on Ubuntu, but the .exe file can not run on my Windows PC (win version: 21H1), showing the following errors in PowerShell window:

    PS D:\tmp> .\hello_burrito_cli_win64.exe
    The system cannot find the path specified.
    The system cannot find the path specified.
    The system cannot find the path specified.
    The system cannot find the path specified.
    

    I found a similar issue in the bakeware repo, not sure if they are related.

    opened by xhh 10
  • Results  from attempted run on Apple M1

    Results from attempted run on Apple M1

    Vanilla:

    [email protected] example % arch                                      arm64
    [email protected] example % mix release                               Release example_cli_app-0.1.0 already exists. Overwrite? [Yn] y
    * assembling example_cli_app-0.1.0 on MIX_ENV=dev
    * skipping runtime configuration (config/runtime.exs not found)
    
    17:19:16.758 [info]  Burrito build target is: :native
    
    17:19:17.255 [info]  Build working dir: /var/folders/fj/m1gn99tx05v1h8tdwtkkhgvr0000gn/T/burrito_build_36CCA0C1B4461889
    
    17:19:17.256 [info]  Patching shell script for release...
    
    17:19:17.259 [info]  Generating wrapper metadata file...
    
    17:19:17.481 [error] Burrito failed to wrap up your app! Check the logs for more information.
    ** (exit) 1
        (burrito 0.4.0) lib/burrito.ex:219: Burrito.do_wrap/5
        (elixir 1.12.3) lib/enum.ex:930: Enum."-each/2-lists^foreach/1-0-"/2
        (burrito 0.4.0) lib/burrito.ex:34: Burrito.wrap/1
        (mix 1.12.3) lib/mix/tasks/release.ex:1047: Mix.Tasks.Release.run_steps/1
        (mix 1.12.3) lib/mix/task.ex:394: anonymous fn/3 in Mix.Task.run_task/3
    

    With rosetta?

    [email protected] example % arch -x86_64 mix release                  Release example_cli_app-0.1.0 already exists. Overwrite? [Yn] y
    * assembling example_cli_app-0.1.0 on MIX_ENV=dev
    * skipping runtime configuration (config/runtime.exs not found)
    
    17:22:30.892 [info]  Burrito build target is: :native
    
    17:22:31.382 [info]  Build working dir: /var/folders/fj/m1gn99tx05v1h8tdwtkkhgvr0000gn/T/burrito_build_9566FAB46C2CEF47
    
    17:22:31.383 [info]  Patching shell script for release...
    
    17:22:31.393 [info]  Generating wrapper metadata file...
    
    17:22:32.119 [error] Burrito failed to wrap up your app! Check the logs for more information.
    ** (exit) 1
        (burrito 0.4.0) lib/burrito.ex:219: Burrito.do_wrap/5
        (elixir 1.12.3) lib/enum.ex:930: Enum."-each/2-lists^foreach/1-0-"/2
        (burrito 0.4.0) lib/burrito.ex:34: Burrito.wrap/1
        (mix 1.12.3) lib/mix/tasks/release.ex:1047: Mix.Tasks.Release.run_steps/1
        (mix 1.12.3) lib/mix/task.ex:394: anonymous fn/3 in Mix.Task.run_task/3
        (mix 1.12.3) lib/mix/cli.ex:84: Mix.CLI.run_task/2
    

    Hope that is useful, let me know if I should try anything else :)

    bug 
    opened by lawik 9
  • archiver.zig: expected type c_uint found usize

    archiver.zig: expected type c_uint found usize

    ---> Generating wrapper metadata file...                                                                                                                     
    ./src/archiver.zig:90:74: error: expected type 'c_uint', found 'usize'                                                                                       
                try write_file_record(&foilz_writer, index, file_buffer, stat.mode);
    

    I am trying to wrap a trivial Elixir app created with mix.new, just to test Burrito out and see the relative sizes of various bundles. I get the above error, plus the admonition to "check the logs", but I don't know where the logs are--there are none in the application directories or in the build folder in /tmp. I'm sorry, I don't know Zig at all; I'm happy to help chase this but I don't know where to start.

    OS is Debian Unstable, up to date. Elixir, Erlang, and Zig were installed with the asdf package manager. asdf list returns

    elixir                                                                                                                                                       
      1.13.4-otp-24                                                                                                                                              
    erlang                                                                                                                                                       
      24.3.4                                                                                                                                                     
    zig                                                                                                                                                          
      0.9.0
    
    opened by cro 8
  • Windows ETRS v13 failed to load NIF public_key

    Windows ETRS v13 failed to load NIF public_key

    Host

    Tell us about your Host OS (the machine you're building burrito apps on)

    Host OS: MacOS 12.4 Host CPU: x86_64

    Please run zig version in your Burrito project directory and write the version here: 0.9.1

    Please run elixir -v in your Burrito project directory and write the version here: 1.13.4


    Target

    Host OS: Windows 11 Host CPU: x86_64


    Running the .exe issues the following error:

    "Failed to load NIF library c:/Users/ariseit/AppData/Local/.burrito/burrito_erts-13.0_0.1.0/lib/public_key-1.13/priv/lib/public_key: 'The specified module could not be found.'"
    
    bug 
    opened by tim-smart 6
  • Misleading error when precompiled Erlang is not available

    Misleading error when precompiled Erlang is not available

    I'm on macOS 11.6.5 (Big Sur) x86-64 and trying to build a Linux x86-64 release with burrito commit 8f25957ccb15073c876c1797a9315902effb05c5. I have Zig 0.9.1 installed, and I'm using Erlang 24.2.2, Elixir 1.13.4.

    When I try to build my release, I get this error (after all the compiling of the deps):

    Generated code_stats app
    * assembling code_stats-2.3.0 on MIX_ENV=prod
    * using config/runtime.exs to configure the release at runtime
    * creating _build/prod/rel/code_stats/releases/2.3.0/vm.args
    * creating _build/prod/rel/code_stats/releases/2.3.0/env.sh
    * creating _build/prod/rel/code_stats/releases/2.3.0/env.bat
    -> Burrito is building target: linux
    -> Burrito will build for target:
            OS: linux
            CPU: x86_64
            Qualifiers: [libc: :glibc]
            Debug: false
    --> PHASE: :fetch
    ---> Working directory: /var/folders/h9/b8n6qz715cj7ws460yq15v240000gn/T/burrito_build_C10476C909D9DDDE
    ---> Resolving ERTS: {:precompiled, [version: "24.2.2"]}
    --> PHASE: :patch
    ** (CaseClauseError) no case clause matching: {:precompiled, [version: "24.2.2"]}
        (burrito 0.8.0) lib/steps/patch/copy_erts.ex:13: Burrito.Steps.Patch.CopyERTS.execute/1
        (burrito 0.8.0) lib/builder/builder.ex:146: anonymous fn/3 in Burrito.Builder.run_phase/2
        (elixir 1.13.3) lib/enum.ex:2396: Enum."-reduce/3-lists^foldl/2-0-"/3
        (elixir 1.13.3) lib/enum.ex:937: Enum."-each/2-lists^foreach/1-0-"/2
        (burrito 0.8.0) lib/builder/builder.ex:95: Burrito.Builder.build/1
        (mix 1.13.3) lib/mix/tasks/release.ex:1056: Mix.Tasks.Release.run_steps/1
        (mix 1.13.3) lib/mix/task.ex:397: anonymous fn/3 in Mix.Task.run_task/3
        (mix 1.13.3) lib/mix/cli.ex:84: Mix.CLI.run_task/2
    

    I looked at the code and it seems there is no case clause for that, but I didn't look into it more yet to see how it all works. Please let me know if you need more info.

    opened by Nicd 5
  • Use XZ Compression

    Use XZ Compression

    Testing

    I confirm that the changes in this PR have been tested on:

    • [x] Windows (10 or above)
    • [x] MacOS (11.0 or above)
    • [x] Linux (glibc)
    • [x] Linux (musl)

    Changelog

    • Replaces gzip with xz+lzma2 compression

    • Reduces the size of the FOILZ archive by moving mode to use c_uint rather than u64

    • Prints a warning for missing 7z in the PATH as we really only use them for Windows builds

    • Fixes up the README including a mistyped build qualifier for custom ERTS slipstream archives


    Supporting Screenshots

    Comparison of GZIP vs XZ/LZMA on MIX_ENV=prod

    -rwxr--r--   1 digit  staff   6.2M Mar 23 09:11 example_cli_app_macos_m1_GZIP
    -rwxr--r--   1 digit  staff   5.7M Mar 23 08:45 example_cli_app_macos_m1_XZ
    
    opened by doawoo 4
  • Path.expand before Path.wildcard for Windows

    Path.expand before Path.wildcard for Windows

    Hello friends. Thanks for doing the hard yards!

    This PR sneaks Path.expand in before any Path.wildcard so it can be used on Windows.

    Are there any other blockers for Windows builds? I've shoehorned a soon-to-be-released project I've been working on that generates an executable instead of all the batch scripts and allows extra CLI commands. That felt easier than figuring out passing/escaping args, which I know you have enjoyed playing with! I'm able to build my project, but it uses a custom build pipeline, no wrapping. Happy to help with Windows nightmares.

    opened by simonmcconnell 4
  • Cache Erlang (OTP) to local instead of re-downloading everytime

    Cache Erlang (OTP) to local instead of re-downloading everytime

    Everytime I run MIX_ENV=prod mix release, it downloads OTP from github (for win64):

    16:07:33.233 [info]  Downloading replacement ERTS: https://github.com/erlang/otp/releases/download/OTP-24.0.6/otp_win64_24.0.6.exe
    

    which takes much time (in my location). Would it be better to cache it somewhere?

    opened by xhh 4
  • Some versions of OTP are still being built

    Some versions of OTP are still being built

    We just swapped over from a private Git deployment to Github, and are still waiting on some OTP versions to be built. You can track the status of that here: https://github.com/burrito-elixir/erlang-builder/actions

    In the meantime, releases may fail if they depend on an as-of-yet-unbuilt version of OTP.

    I'll close this issue once those builds finish!

    opened by QuinnWilton 2
  • Allow Req 0.3.0

    Allow Req 0.3.0

    I don't think burrito is impacted by any of the changes, and no deprecation warnings are emitted.

    https://github.com/wojtekmach/req/blob/main/CHANGELOG.md

    opened by bsedat 1
  • Wrapper build failed

    Wrapper build failed

    Hi.

    I've added Burrito to a command-line app that was previously using escript. When I try and create a release I get the following output:

    * assembling arx-0.4.4 on MIX_ENV=prod
    * skipping runtime configuration (config/runtime.exs not found)
    -> Burrito is building target: macos
    -> Burrito will build for target:
    	OS: darwin
    	CPU: x86_64
    	Qualifiers: [libc: nil]
    	Debug: false
    --> PHASE: :fetch
    ---> Working directory: /var/folders/dw/tmf07r7n1cv6khc7rc35q4cw0000gn/T/burrito_build_9E8CAC2198B9D99B
    ---> Resolving ERTS: {:runtime, []}
    --> PHASE: :patch
    --> PHASE: :build
    ---> Generating wrapper metadata file...
    ./src/archiver.zig:51:62: error: no member named 'write' in struct 'std.fs.file.File.OpenFlags'
        const arch_file = try fs.cwd().openFile(archive_path, .{ .write = true });
                                                                 ^
    ---> Cleaning up...
    ---> Burrito failed to wrap up your app! Check the logs for more information.
    ** (RuntimeError) Wrapper build failed
        (burrito 0.8.0) lib/steps/build/pack_and_build.ex:59: Burrito.Steps.Build.PackAndBuild.execute/1
        (burrito 0.8.0) lib/builder/builder.ex:146: anonymous fn/3 in Burrito.Builder.run_phase/2
        (elixir 1.13.1) lib/enum.ex:2396: Enum."-reduce/3-lists^foldl/2-0-"/3
        (elixir 1.13.1) lib/enum.ex:937: Enum."-each/2-lists^foreach/1-0-"/2
        (burrito 0.8.0) lib/builder/builder.ex:95: Burrito.Builder.build/1
        (mix 1.13.1) lib/mix/tasks/release.ex:1048: Mix.Tasks.Release.run_steps/1
        (mix 1.13.1) lib/mix/task.ex:397: anonymous fn/3 in Mix.Task.run_task/3
        (mix 1.13.1) lib/mix/cli.ex:84: Mix.CLI.run_task/2
    

    macOS 10.14.6 Erlang/OTP 24.2 Elixir 1.13.1-otp-24 Zig 0.10.0-dev.1659+4dd65316b

    Alas, I have no experience with Zig so not sure what to make of this. I'm wondering if it's a change in Zig since the version number is pre 1.0.

    opened by mmower 1
  • warning: Burrito.wrap/1 is undefined

    warning: Burrito.wrap/1 is undefined

    When ElixirLS is building a project with Burrito releases it warns warning: Burrito.wrap/1 is undefined (module Burrito is not available or is yet to be defined) - this is somewhat expected because it is evaluating mix.exs and Burrito isn't available yet.

    I was hoping to solve this with an xref exclude in the mix project configuration but that didn't seem to do it. Not a high priority at all but figured I would ask so we can combine minds and see if there is an easy solution.

    opened by bsedat 0
  • Difference between bakeware?

    Difference between bakeware?

    Sorry for out of context bug report but I think this could be important coming from bakeware. https://github.com/bake-bake-bake/bakeware/issues/133

    What are the main differences between bakeware and burrito?

    bug 
    opened by vans163 1
  • GitHub rate limits when building

    GitHub rate limits when building

    I didn't fill out the issue template because this isn't really related to the build specifically.

    One issue I ran into whilst running builds for testing, was hitting the unauthenticated API request limit for GitHub.

    ---> Error occurred when trying to fetch releases from Github
    	 Reason: API rate limit exceeded for [MY IP ADDRESS]. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)
    

    This is trivial to work around with a personal authentication token, like this:

    --- a/lib/util/erts_url_fetcher.ex
    +++ b/lib/util/erts_url_fetcher.ex
    @@ -79,7 +79,10 @@ defmodule Burrito.Util.ERTSUrlFetcher do
       defp get_gh_pages(url, page \\ 1, acc \\ []) do
         # page through all the asset results until we have no more
         # then return the full list of them
    -    case Req.get!(url <> "&page=#{page}") do
    +    headers = [
    +      {"authorization", "token [MY PERSONAL API TOKEN]"}
    +    ]
    +    case Req.get!(url <> "&page=#{page}", headers: headers) do
           %Req.Response{status: 200, body: []} ->
             {:ok, acc}
    

    I'm happy to open a PR to add this, maybe as an environment variable that we use if specified. Something like GITHUB_API_TOKEN?

    If we wanted to point a user in the right direction, we could modify the Req result match to look for API rate limit exceeded in the error message and prompt them to set this environment variable.

    bug 
    opened by Gazler 1
  • Burrito without epmd can no longer start app

    Burrito without epmd can no longer start app

    Hi.

    I'm building a command-line tool in Elixir using Burrito. Because of the nature of the tool and to avoid firewall warnings I am using

    rel/vm.args.eex -start_epmd false

    And all was well. Now fast forward a month or so and I am trying to execute the command again:

    Irulan:grue matt$ ./burrito_out/rez_macos Protocol 'inet_tcp': register/listen error: econnrefused

    As far as I can tell this is a result of epmd not being present. As far as I can ascertain (I am no Erlang expert) the BEAM looks for epmd when started as a distributed node (e.g. using -name or -sname). As far as I know I am not doing that, there'd be no reason to.

    git status tells me that I haven't changed my code since it was working and I don't think I've changed my Elixir or Erlang versions (according to asdf they are 1.31.1-otp-24 & 24.2 respectively).

    I'm really not sure where to start with this and maybe you think it's nothing to do with Burrito. But I figured I'd ask you guys first.

    Any ideas why this might have changed or what I can do about it?

    Thanks.

    bug 
    opened by mmower 7
  • WIP: Auto-fetch Zig for users

    WIP: Auto-fetch Zig for users

    Zig versions can get confusing due to how quickly the language moves and changes.

    Since it's so portable, this PR introduces a module that can determine the current host platform, and auto-downloads a Zig build of the version we lock to, and extracts it into the Burrito deps directory.

    All zig operations in the builder steps have been replaced with a call to computer the path to the caches zig binary instead of using the system zig

    TODO: We probably want to allow people to override this, perhaps a BURRITO_USE_SYSTEM_ZIG environment variable.

    opened by doawoo 0
Owner
null
Example-application - Example out-of-tree application that is also a module

Zephyr Example Application This repository contains a Zephyr example application. The main purpose of this repository is to serve as a reference on ho

Zephyr Project 74 Sep 14, 2022
The Vulkan Profiles Tools are a collection of tools delivered with the Vulkan SDK for Vulkan application developers to leverage Vulkan Profiles while developing a Vulkan application

Copyright Β© 2021-2022 LunarG, Inc. Vulkan Profiles Tools (BETA) The Vulkan Profiles Tools are a collection of tools delivered with the Vulkan SDK for

The Khronos Group 61 Sep 17, 2022
A free and open-source cross-platform application to control your Philips hue compatible lightsπŸ’‘

?? OpenHue ?? A cross platform application to control your Philips hue compatible lights. licensed under the gpl 3.0 license. Currently in super early

BOB450 3 Dec 19, 2021
A way to visualize your multithreaded Mbed OS application like never before!

MbedSysview Library A way to visualize your multithreaded Mbed OS application like never before! MbedSysview is a library that connects the Mbed OS ta

Jamie Smith 4 Aug 10, 2022
The package allows to use H3 library directly in your Flutter application

The package allows to use H3 library directly in your Flutter application

Ilya Beregovskiy 10 Jul 13, 2022
Learn how to connect your Flexispot (LoctekMotion) desk to the internet. This repository contains a collection of scripts to get your started, combined with research and instructions.

(image source: Windows Central) Turn your LoctekMotion/FlexiSpot desk into a smart desk Recently I acquired a new standing desk from FlexiSpot. During

Mick Vleeshouwer 183 Oct 5, 2022
emPOWer your commits. Pointlessly flex on your coworkers with bespoke commit hashes, all with the convenience of a single command.

git-power emPOWer your commits. Pointlessly flex on your coworkers with bespoke commit hashes, all with the convenience of a single command.

Glenn Smith 243 Jun 27, 2022
A header maker, this project will create your header file with all your declaration in

Headermaker Install: git clone https://github.com/rmechety42/Headermaker.git cd Headermaker make install Usage: Headermaker src_folder_you_want_to

Rayan Mechety 36 Sep 11, 2022
Lock you keyboard and clean your screen. A simple, and easy way to clean your computers.

Pristine Cleaner A screen and keyboard cleaning application made to turn screen black, and lock keyboard for easy cleaning. With features such as star

Rhino Inani 2 Jan 16, 2022
✨ Your best friend when it comes to making your output beautiful ✨

?? Fadey ✨ Your best friend when it comes to making your output beautiful ✨ ?? Content: About Requirements Installation Features Performance Shoutout

Fluffy 3 Nov 29, 2021
A program to backup all of your game savefiles on your system, neatly, and into a single folder.

Savefile Saver I created this project as a solution to a simple, but annoying problem: Backing up my game savefiles. I wanted to be able to copy all o

Dominic Esposito 4 Jun 8, 2022
Flutter app where you can find your information about your Favorite Super Cars ⚑❀

Super Cars App (Flutter) ⚑ Now you can freely discover and browse your Favourite Super Cars ❀ . Speed! ?? Getting Started This project is a starting p

Shehroz Ali 4 Apr 13, 2022
Rocket is an application launcher for KDE Plasma

Rocket is an application launcher for KDE Plasma. It sorts all of your applications in a horizontal or vertical grid alphabetically, so you will always find what you are looking for at first glance. No more menu navigation, only scrolling.

null 23 Mar 25, 2022
layer to control the global priority of any vulkan application

vk-force-priority vk-force-priority allows you to control the global priority of any vulkan application. Building from Source Dependencies Before buil

Georg Lehmann 5 Sep 2, 2021
Example application for Sparkfun-Himax workshop with CCS811 sensor

What's that smell workshop This repo contains the example applications for the workshop with Sparkfun Qwiic Environmental Combo breakout and Himax WE-

Edge Impulse 5 Apr 16, 2021
Drone music application for Gameboy

Droneboy Drone music application for Gameboy. This little app creates endless tones or drones on the Gameboys four channels. You can manipulate volume

null 24 Aug 29, 2022
FM radio tuner application for Raspberry Pi OS

GTK FM Tuner GTK FM Tuner is a lightweight, GUI base FM radio tuner application for Raspberry Pi OS. This application uses GTK to provide the UI of th

Dilshan R Jayakody 14 Apr 25, 2022
Simple application for a countdown time

README POLSKI Opis aplikacji WorkTimer to prosta aplikacja do odliczania czasu. Projekt powstaΕ‚ z myΕ›lΔ… o stosowaniu regularnych przerw od komputera w

Karol 2 Oct 4, 2021
The simple UEFI application to create a Windows Platform Binary Table (WPBT) from the UEFI shell.

WPBT Builder This is a simple UEFI application to create a Windows Platform Binary Table (WPBT) from the UEFI shell. Motivation WPBT is one of the Adv

Satoshi Tanda 67 Sep 12, 2022