Files
bDS2/mix.exs
2026-07-17 12:04:07 +02:00

124 lines
3.6 KiB
Elixir

defmodule BDS.MixProject do
use Mix.Project
def project do
ensure_xla_compiler_flags()
[
app: :bds,
version: "0.1.0",
elixir: "~> 1.17",
default_release: :bds,
releases: releases(),
start_permanent: Mix.env() == :prod,
dialyzer: dialyzer(),
aliases: aliases(),
deps: deps()
]
end
# XLA 0.9.x headers (pulled by exla) illegally specialize `std::is_signed`,
# which Apple clang 17+/libc++ rejects with a hard `-Winvalid-specialization`
# error, breaking the exla NIF build. Disable just that diagnostic on macOS so
# the C++ compile succeeds. Guarded to Darwin so the Linux/gcc build path is
# untouched. Appends rather than overwrites any CFLAGS the caller already set.
defp ensure_xla_compiler_flags do
if :os.type() == {:unix, :darwin} do
flag = "-Wno-invalid-specialization"
current = System.get_env("CFLAGS", "")
unless String.contains?(current, flag) do
System.put_env("CFLAGS", String.trim(flag <> " " <> current))
end
end
end
def application do
[
extra_applications: [:logger, :wx, :ssl],
mod: {BDS.Application, []}
]
end
def cli do
[preferred_envs: [validate: :test]]
end
defp deps do
[
{:ecto_sql, "~> 3.14"},
{:ecto_sqlite3, "~> 0.24"},
{:luerl, "~> 1.5"},
{:jason, "~> 1.4"},
{:mdex, "~> 0.13"},
{:liquex, "~> 0.13.1"},
{:plug, "~> 1.18"},
{:bandit, "~> 1.5"},
{:req, "~> 0.5"},
{:live_toast, "~> 0.8.0"},
{:saxy, "~> 1.4"},
{:desktop, "~> 1.5"},
{:ex_ratatui, "~> 0.11"},
{:image, "~> 0.67"},
{:nx, "~> 0.10"},
{:exla, "~> 0.10"},
# Apple Silicon GPU (Metal) acceleration for embedding inference. Ships
# precompiled MLX binaries; the Neural backend prefers it on arm64 macOS
# and falls back to EXLA-CPU elsewhere (SPECGAPS A1-14c).
{:emlx, "~> 0.2.0"},
{:bumblebee, "~> 0.6.3"},
{:hnswlib, "~> 0.1.7"},
{:stemex, "~> 0.2.1"},
{:gettext, "~> 0.24"},
{:tailwind, "~> 0.3", runtime: Mix.env() == :dev},
{:esbuild, "~> 0.10", runtime: Mix.env() == :dev},
{:lazy_html, ">= 0.1.0", only: :test},
{:credo, "~> 1.7", only: [:dev, :test], runtime: false},
{:mix_audit, "~> 2.1", only: [:dev, :test], runtime: false},
{:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false},
{:ex_doc, "~> 0.34", only: :dev, runtime: false}
]
end
defp aliases do
[
setup: ["deps.get", "ecto.setup"],
"ecto.setup": ["ecto.create", "ecto.migrate"],
"ecto.reset": ["ecto.drop", "ecto.setup"],
"assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"],
"assets.build": ["tailwind default", "esbuild default", "esbuild monaco", "esbuild monaco_workers"],
"assets.deploy": [
"tailwind default --minify",
"esbuild default --minify",
"esbuild monaco --minify",
"esbuild monaco_workers --minify"
],
test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"],
validate: ["test", "credo --strict", "deps.audit --ignore-file .mix_audit.ignore", "dialyzer"]
]
end
defp dialyzer do
env = Mix.env()
[
plt_add_apps: [:mix, :inets, :ssl, :nx, :exla, :emlx, :bumblebee, :hnswlib],
paths: ["_build/#{env}/lib/bds/ebin"]
]
end
defp releases do
[
bds: [
include_executables_for: [:unix, :windows],
applications: [bds: :permanent]
],
bds_mcp: [
path: "_build/#{Mix.env()}/rel/bds_mcp",
include_executables_for: [:unix, :windows],
applications: [bds: :permanent]
]
]
end
end