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