defmodule Vodozemac.MixProject do use Mix.Project @version "0.1.2" @source_url "https://git.sr.ht/~sbr/vodozemac" def project do [ app: :vodozemac, version: @version, elixir: "~> 1.15", elixirc_paths: elixirc_paths(Mix.env()), start_permanent: Mix.env() == :prod, deps: deps(), aliases: aliases(), description: description(), package: package(), docs: docs(), dialyzer: dialyzer(), source_url: @source_url, homepage_url: @source_url ] |> Keyword.merge(umbrella_paths()) end def application do [extra_applications: [:logger]] end # `mix precommit` chains `mix test` as one of its steps; without this # block Mix runs the whole alias in :dev and `mix test` complains # about the env mismatch. Switching the alias to :test is fine — # format/credo/audit/dialyzer/hex.build are all env-agnostic. def cli do [preferred_envs: [precommit: :test]] end defp elixirc_paths(:test), do: ["lib", "test/support"] defp elixirc_paths(_), do: ["lib"] defp deps do [ {:rustler_precompiled, "~> 0.8"}, # 0.1.0 ships source-only — `force_build: true` in Vodozemac.Native # means rustler_precompiled hands compilation off to rustler on # every consumer build, so rustler must actually be present. # Flip back to `optional: true` once 0.1.1 ships the precompiled # tarballs (most consumers won't compile from source then). {:rustler, "~> 0.36"}, {:ex_doc, "~> 0.34", only: :dev, runtime: false}, # Static analysis + audit, all dev/test-only. {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, # ExSlop bundles credo checks for AI-generated-code antipatterns. # See https://github.com/elixir-vibe/ex_slop. Opt-in via # `EX_SLOP=1 mix credo` (.credo.exs reads the env var). {:ex_slop, "~> 0.1", only: [:dev, :test], runtime: false}, {:mix_audit, "~> 2.1", only: [:dev, :test], runtime: false}, {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false} ] end defp aliases do [ # Run before every commit / release. `mix hex.publish` runs # `hex.build` internally, so no need to chain it here. precommit: [ "format --check-formatted", "credo", "deps.audit", "dialyzer", "test" ] ] end defp dialyzer do [ plt_add_apps: [:ex_unit, :mix], flags: [:error_handling, :unknown, :underspecs], ignore_warnings: ".dialyzer_ignore.exs" ] end defp description do "Elixir bindings to Matrix's Olm and Megolm primitives via Element's " <> "vodozemac (Rust) — the successor to the deprecated libolm." end defp package do [ # TODO: fill these in before `mix hex.publish`. maintainers: ["sbr"], licenses: ["BSD-3-Clause"], links: %{ "Source" => @source_url, "Changelog" => @source_url <> "/tree/main/item/CHANGELOG.md", "vodozemac (upstream Rust)" => "https://github.com/matrix-org/vodozemac" }, # checksum-Elixir.Vodozemac.Native.exs is regenerated after # precompiled artifacts are uploaded for a tagged release; add # it here for 0.1.1 when binaries start shipping. files: ~w( lib native/vodozemac_nif/Cargo.toml native/vodozemac_nif/src mix.exs README.md CHANGELOG.md LICENSE LICENSE-APACHE ) ] end defp docs do [ main: "readme", extras: ["README.md", "CHANGELOG.md", "LICENSE"], source_ref: "v#{@version}" ] end # When the package lives inside the 8by3 umbrella, share the parent # build/deps directories. After extraction into its own repo (no # `../../mix.exs` next to us), the parent dirs don't exist and we # build standalone. Same mix.exs works in both places. defp umbrella_paths do if File.exists?(Path.expand("../../mix.exs", __DIR__)) do [ build_path: "../../_build", config_path: "../../config/config.exs", deps_path: "../../deps", lockfile: "../../mix.lock" ] else [] end end end