defmodule NervesSystemRpi5Gpu.MixProject do use Mix.Project @github_organization "spin42" @app :nerves_system_rpi5_gpu @source_url "https://github.com/#{@github_organization}/#{@app}" @version Path.join(__DIR__, "VERSION") |> File.read!() |> String.trim() def project do [ app: @app, version: @version, # Because we're using OTP 27, we need to enforce Elixir 1.17 or later. elixir: "~> 1.17", compilers: Mix.compilers() ++ [:nerves_package], nerves_package: nerves_package(), description: description(), package: package(), deps: deps(), aliases: [ loadconfig: [&bootstrap/1], generate_fwup_conf: &generate_fwup_conf/1 ], docs: docs() ] end def application do [] end defp bootstrap(args) do set_target() Application.start(:nerves_bootstrap) Mix.Task.run("loadconfig", args) end def cli do [preferred_envs: %{docs: :docs, "hex.build": :docs, "hex.publish": :docs}] end defp nerves_package do [ type: :system, artifact_sites: [ {:github_releases, "#{@github_organization}/#{@app}"} ], build_runner_opts: build_runner_opts(), platform: Nerves.System.BR, platform_config: [ defconfig: "nerves_defconfig" ], # The :env key is an optional experimental feature for adding environment # variables to the crosscompile environment. These are intended for # llvm-based tooling that may need more precise processor information. env: [ {"TARGET_ARCH", "aarch64"}, {"TARGET_CPU", "cortex_a76"}, {"TARGET_OS", "linux"}, {"TARGET_ABI", "gnu"}, {"TARGET_GCC_FLAGS", "-mabi=lp64 -Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096 -fstack-protector-strong -mcpu=cortex-a76 -fPIE -pie -Wl,-z,now -Wl,-z,relro"} ], checksum: package_files() ] end defp deps do [ {:nerves, "~> 1.11", runtime: false}, {:nerves_system_br, "1.33.0", runtime: false}, {:nerves_toolchain_aarch64_nerves_linux_gnu, "~> 13.2.0", runtime: false}, {:nerves_system_linter, "~> 0.4", only: [:dev, :test], runtime: false}, {:ex_doc, "~> 0.22", only: :docs, runtime: false} ] end defp description do "Nerves System - Raspberry Pi 5 (64-bits with Nvidia GPU support)" end defp docs do [ extras: ["README.md", "CHANGELOG.md"], main: "readme", assets: %{"assets" => "./assets"}, source_ref: "v#{@version}", source_url: @source_url, skip_undefined_reference_warnings_on: ["CHANGELOG.md"] ] end defp package do [ files: package_files(), licenses: ["GPL-2.0-only", "GPL-2.0-or-later"], links: %{ "GitHub" => @source_url, "REUSE Compliance" => "https://api.reuse.software/info/github.com/nerves-project/nerves_system_rpi5" } ] end defp package_files do [ "fwup_include", "rootfs_overlay", "CHANGELOG.md", "cmdline.txt", "config.txt", "fwup-ops.conf", "fwup.conf.eex", "fwup.conf", "LICENSES/*", "linux-6.12.defconfig", "mix.exs", "nerves_defconfig", "post-build.sh", "post-createfs.sh", "ramoops-pi4-overlay.dts", "README.md", "REUSE.toml", "VERSION" ] end defp build_runner_opts() do # Download source files first to get download errors right away. [make_args: primary_site() ++ ["source", "all", "legal-info"]] end defp primary_site() do case System.get_env("BR2_PRIMARY_SITE") do nil -> [] primary_site -> ["BR2_PRIMARY_SITE=#{primary_site}"] end end defp set_target() do if function_exported?(Mix, :target, 1) do apply(Mix, :target, [:target]) else System.put_env("MIX_TARGET", "target") end end defp generate_fwup_conf(_args) do template_path = Path.join(__DIR__, "fwup.conf.eex") output_path = Path.join(__DIR__, "fwup.conf") Mix.shell().info("Generating fwup.conf") content = EEx.eval_file(template_path) File.write!(output_path, content) Mix.shell().info("Successfully generated #{output_path}") end end