Current section
Files
Jump to
Current section
Files
lib/zig/build_module.ex
defmodule Zig.BuildModule do
@moduledoc false
# this module encapulates a struct which carries attributes of extra zig modules
# to be added. The fields of the struct are subject to change as the capabilites of
# zigler are increased, or new features are added in zig.
@enforce_keys [:name, :path]
defstruct @enforce_keys ++
[
:c,
deps: [],
root?: false,
error_tracing: nil
]
alias Zig.Builder
alias Zig.C
use Builder, template: "templates/build_extra_mod.zig.eex"
def from_beam_module(build) do
%__MODULE__{
name: :nif,
path: build.zig_code_path,
deps: [:erl_nif, :beam, :attributes] ++ Enum.map(build.extra_modules, &module_spec/1),
c: build.c
}
end
defp module_spec(%{name: name}), do: name
defp module_spec(%{dep: dep, src_mod: src_mod, dst_mod: dst_mod}), do: {dep, {src_mod, dst_mod}}
# default modules
def erl_nif do
system_include_path =
Path.join([:code.root_dir(), "/erts-#{:erlang.system_info(:version)}", "/include"])
erl_nif_win_path =
:zigler
|> :code.priv_dir()
|> Path.join("erl_nif_win")
%__MODULE__{
name: :erl_nif,
path: Builder.beam_file("erl_nif.zig"),
c: %C{
include_dirs: [system: system_include_path, system: erl_nif_win_path],
link_libc: true
}
}
end
def stub_erl_nif do
%__MODULE__{
name: :erl_nif,
path: Builder.beam_file("stub_erl_nif.zig")
}
end
def beam do
%__MODULE__{
name: :beam,
path: Builder.beam_file("beam.zig"),
deps: [:erl_nif]
}
end
def attributes do
%__MODULE__{
name: :attributes,
path: "attributes.zig"
}
end
def sema do
%__MODULE__{
name: :sema,
path: Builder.beam_file("sema.zig"),
deps: [:nif],
root?: true
}
end
def nif_shim do
%__MODULE__{
name: :nif_shim,
path: "module.zig",
deps: [:beam, :erl_nif, :nif],
root?: true
}
end
end