From 680a73ee33e94078e412f2367b3faeee2da54ca8 Mon Sep 17 00:00:00 2001 From: Steffen Beyer Date: Sat, 14 Mar 2026 03:58:24 +0100 Subject: [PATCH] build: add lib_secp256k1 dep --- default.nix | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++--- devenv.nix | 6 +++++ mix.exs | 1 + mix.lock | 2 ++ 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/default.nix b/default.nix index ef99230..45de1e6 100644 --- a/default.nix +++ b/default.nix @@ -1,11 +1,16 @@ { lib, beam, + fetchFromGitHub, + runCommand, + autoconf, + automake, + libtool, pkg-config, vips, }: let pname = "parrhesia"; - version = "0.1.0"; + version = "0.2.0"; beamPackages = beam.packages.erlang_28.extend ( final: _prev: { @@ -46,13 +51,66 @@ hash = "sha256-1v2+Q1MHbu09r5OBaLehiR+JfMP0Q5OHaWuwrQDzZJU="; } else null; + + # lib_secp256k1 is a :make dep and may not be present in fetchMixDeps output. + # Inject the Hex package explicitly, then vendor upstream bitcoin-core/secp256k1 + # sources to avoid build-time network access. + libSecp256k1Hex = beamPackages.fetchHex { + pkg = "lib_secp256k1"; + version = "0.7.1"; + sha256 = "sha256-eL3TZhoXRIr/Wu7FynTI3bwJsB8Oz6O6Gro+iuR6srM="; + }; + + elixirMakeHex = beamPackages.fetchHex { + pkg = "elixir_make"; + version = "0.9.0"; + sha256 = "sha256-2yPU/Yt1dGKtAviqc0MaQm/mZxyAsgDZcQyvPR3Q/9s="; + }; + + secp256k1Src = fetchFromGitHub { + owner = "bitcoin-core"; + repo = "secp256k1"; + rev = "v0.7.1"; + hash = "sha256-DnBgetf+98n7B1JGtyTdxyc+yQ51A3+ueTIPPSWCm4E="; + }; + + patchedMixFodDeps = + if mixFodDeps == null + then null + else + runCommand mixFodDeps.name {} '' + mkdir -p $out + cp -r --no-preserve=mode ${mixFodDeps}/. $out + chmod -R u+w $out + + rm -rf $out/lib_secp256k1 + cp -r ${libSecp256k1Hex} $out/lib_secp256k1 + chmod -R u+w $out/lib_secp256k1 + + rm -rf $out/elixir_make + cp -r ${elixirMakeHex} $out/elixir_make + + rm -rf $out/lib_secp256k1/c_src/secp256k1 + mkdir -p $out/lib_secp256k1/c_src/secp256k1 + cp -r ${secp256k1Src}/. $out/lib_secp256k1/c_src/secp256k1/ + chmod -R u+w $out/lib_secp256k1/c_src/secp256k1 + + # mixRelease may copy deps without preserving +x bits, so avoid relying + # on executable mode for autogen.sh. + substituteInPlace $out/lib_secp256k1/Makefile \ + --replace-fail "./autogen.sh" "sh ./autogen.sh" + + touch $out/lib_secp256k1/c_src/secp256k1/.fetched + ''; in beamPackages.mixRelease { - inherit pname version src mixFodDeps; + inherit pname version src; + + mixFodDeps = patchedMixFodDeps; mixEnv = "prod"; removeCookie = false; - nativeBuildInputs = [pkg-config]; + nativeBuildInputs = [pkg-config autoconf automake libtool]; buildInputs = [vips]; preConfigure = '' diff --git a/devenv.nix b/devenv.nix index 4c39e93..cf32a82 100644 --- a/devenv.nix +++ b/devenv.nix @@ -78,7 +78,13 @@ in { with pkgs; [ just + gcc git + gnumake + autoconf + automake + libtool + pkg-config # Nix code formatter alejandra # i18n diff --git a/mix.exs b/mix.exs index 7c691c3..6456e10 100644 --- a/mix.exs +++ b/mix.exs @@ -31,6 +31,7 @@ defmodule Parrhesia.MixProject do {:bandit, "~> 1.5"}, {:plug, "~> 1.15"}, {:websock_adapter, "~> 0.5"}, + {:lib_secp256k1, "~> 0.7"}, # Runtime: storage adapter (Postgres first) {:ecto_sql, "~> 3.12"}, diff --git a/mix.lock b/mix.lock index 2b328b9..7f71e45 100644 --- a/mix.lock +++ b/mix.lock @@ -10,12 +10,14 @@ "deps_changelog": {:hex, :deps_changelog, "0.3.5", "65981997d9bc893b8027a0c03da093a4083328c00b17f562df269c2b61d44073", [:mix], [], "hexpm", "298fcd7794395d8e61dba8d29ce8fcee09f1df4d48adb273a41e8f4a1736491e"}, "ecto": {:hex, :ecto, "3.13.5", "9d4a69700183f33bf97208294768e561f5c7f1ecf417e0fa1006e4a91713a834", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "df9efebf70cf94142739ba357499661ef5dbb559ef902b68ea1f3c1fabce36de"}, "ecto_sql": {:hex, :ecto_sql, "3.13.5", "2f8282b2ad97bf0f0d3217ea0a6fff320ead9e2f8770f810141189d182dc304e", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.13.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aa36751f4e6a2b56ae79efb0e088042e010ff4935fc8684e74c23b1f49e25fdc"}, + "elixir_make": {:hex, :elixir_make, "0.9.0", "6484b3cd8c0cee58f09f05ecaf1a140a8c97670671a6a0e7ab4dc326c3109726", [:mix], [], "hexpm", "db23d4fd8b757462ad02f8aa73431a426fe6671c80b200d9710caf3d1dd0ffdb"}, "file_system": {:hex, :file_system, "1.1.1", "31864f4685b0148f25bd3fbef2b1228457c0c89024ad67f7a81a3ffbc0bbad3a", [:mix], [], "hexpm", "7a15ff97dfe526aeefb090a7a9d3d03aa907e100e262a0f8f7746b78f8f87a5d"}, "finch": {:hex, :finch, "0.21.0", "b1c3b2d48af02d0c66d2a9ebfb5622be5c5ecd62937cf79a88a7f98d48a8290c", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "87dc6e169794cb2570f75841a19da99cfde834249568f2a5b121b809588a4377"}, "glob_ex": {:hex, :glob_ex, "0.1.11", "cb50d3f1ef53f6ca04d6252c7fde09fd7a1cf63387714fe96f340a1349e62c93", [:mix], [], "hexpm", "342729363056e3145e61766b416769984c329e4378f1d558b63e341020525de4"}, "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, "igniter": {:hex, :igniter, "0.7.4", "b5f9dd512eb1e672f1c141b523142b5b4602fcca231df5b4e362999df4b88e14", [:mix], [{:glob_ex, "~> 0.1.7", [hex: :glob_ex, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:owl, "~> 0.11", [hex: :owl, repo: "hexpm", optional: false]}, {:phx_new, "~> 1.7", [hex: :phx_new, repo: "hexpm", optional: true]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}, {:rewrite, ">= 1.1.1 and < 2.0.0-0", [hex: :rewrite, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.4", [hex: :sourceror, repo: "hexpm", optional: false]}, {:spitfire, ">= 0.1.3 and < 1.0.0-0", [hex: :spitfire, repo: "hexpm", optional: false]}], "hexpm", "971b240ee916a06b1af56381a262d9eeaff9610eddc299d61a213cd7a9d79efd"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, + "lib_secp256k1": {:hex, :lib_secp256k1, "0.7.1", "53cad778b8da3a29e453a7a477517d99fb5f13f615c8050eb2db8fd1dce7a1db", [:make, :mix], [{:elixir_make, "~> 0.9", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "78bdd3661a17448aff5aeec5ca74c8ddbc09b01f0ecfa3ba1aba3e8ae47ab2b3"}, "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"},