lib/zig/target.ex

defmodule Zig.Target do
  @moduledoc """
  interfaces for cross-compilation logic.

  this function primarily exists to support Nerves deployments, though
  it is possible to set an arbitrary cross-compilation target using a
  setting in your `use Zig` directive.  This selects the architecture
  by checking your "CC" environment variable, which is in turn set by
  Nerves, then adjusts gcc's machine type to a string which allows zig to
  select the appropriate cross-compilation settings and libc.
  """

  defstruct [:arch, :os, :abi]

  @type t :: %__MODULE__{
          arch: String.t(),
          os: String.t(),
          abi: String.t()
        }

  # obtains the target from the
  @spec resolve() :: nil | t
  def resolve do
    unless function_exported?(Mix, :target, 0) and Mix.target() === :host do
      arch = System.get_env("TARGET_ARCH")
      os = System.get_env("TARGET_OS")
      abi = System.get_env("TARGET_ABI")

      if arch && os && abi do
        %__MODULE__{arch: arch, os: os, abi: abi}
      end
    end
  end

  def for_builder(target \\ resolve()) do
    if target do
      ".{.default_target=.{.cpu_arch = .#{target.arch}, .os_tag = .#{target.os}, .abi = .#{target.abi}}}"
    else
      ".{}"
    end
  end
end