From cf83a75ceb00862a0b981ce59f64edf986ac63ff Mon Sep 17 00:00:00 2001 From: Mickael Remond Date: Mon, 6 Apr 2015 12:29:11 +0200 Subject: [PATCH] Fix asn1 module compilation with mix This should solve building ejabberd as an Elixir dependency. --- lib/mix/tasks/compile.asn1.ex | 53 ----------------------------------- mix.exs | 40 +++++++++++++++++++++++--- 2 files changed, 36 insertions(+), 57 deletions(-) delete mode 100644 lib/mix/tasks/compile.asn1.ex diff --git a/lib/mix/tasks/compile.asn1.ex b/lib/mix/tasks/compile.asn1.ex deleted file mode 100644 index e1af6046f..000000000 --- a/lib/mix/tasks/compile.asn1.ex +++ /dev/null @@ -1,53 +0,0 @@ -defmodule Mix.Tasks.Compile.Asn1 do - use Mix.Task - alias Mix.Compilers.Erlang - - @recursive true - @manifest ".compile.asn1" - - @moduledoc """ - Compile ASN.1 source files. - When this task runs, it will check the modification time of every file, and - if it has changed, the file will be compiled. Files will be - compiled in the source directory with a .erl extension and generate a .hrl file. - You can force compilation regardless of modification times by passing - the `--force` option. - ## Command line options - * `--force` - forces compilation regardless of modification times - ## Configuration - * `:asn1_paths` - directories to find asn1 files. Defaults to `["asn1"]`. - """ - - @doc """ - Runs this task. - """ - @spec run(OptionParser.argv) :: :ok | :noop - def run(args) do - {opts, _, _} = OptionParser.parse(args, switches: [force: :boolean]) - - project = Mix.Project.config - source_paths = project[:asn1_paths] || ["asn1"] - dest_paths = project[:erlc_paths] - mappings = Enum.zip(source_paths, dest_paths) - options = project[:asn1_options] || [] - - Erlang.compile(manifest(), mappings, :asn1, :erl, opts[:force], fn - input, output -> - options = options ++ [:noobj, outdir: Erlang.to_erl_file(Path.dirname(output))] - :asn1ct.compile(Erlang.to_erl_file(input), options) - end) - end - - @doc """ - Returns ASN.1 manifests. - """ - def manifests, do: [manifest] - defp manifest, do: Path.join(Mix.Project.manifest_path, @manifest) - - @doc """ - Cleans up compilation artifacts. - """ - def clean do - Erlang.clean(manifest()) - end -end diff --git a/mix.exs b/mix.exs index 8e735264b..5dfe44967 100644 --- a/mix.exs +++ b/mix.exs @@ -7,8 +7,9 @@ defmodule Ejabberd.Mixfile do elixir: "~> 1.0", elixirc_paths: ["lib"], compile_path: ".", - compilers: Mix.compilers, + compilers: [:asn1] ++ Mix.compilers, erlc_options: erlc_options, + erlc_paths: ["asn1", "src"], deps: deps] end @@ -33,12 +34,43 @@ defmodule Ejabberd.Mixfile do {:p1_cache_tab, github: "processone/cache_tab"}, {:p1_utils, github: "processone/p1_utils"}, {:p1_iconv, github: "processone/eiconv"}, - {:esip, github: "processone/p1_sip"}, - {:p1_stun, github: "processone/stun"}, + {:esip, github: "processone/p1_sip"}, + {:p1_stun, github: "processone/stun"}, {:ehyperloglog, github: "vaxelfel/eHyperLogLog"}, {:p1_mysql, github: "processone/mysql"}, {:p1_pgsql, github: "processone/pgsql"}, - {:eredis, github: "wooga/eredis"} + {:eredis, github: "wooga/eredis"} ] end end + +defmodule Mix.Tasks.Compile.Asn1 do + use Mix.Task + alias Mix.Compilers.Erlang + + @recursive true + @manifest ".compile.asn1" + + @spec run(OptionParser.argv) :: :ok | :noop + def run(args) do + {opts, _, _} = OptionParser.parse(args, switches: [force: :boolean]) + + project = Mix.Project.config + source_paths = project[:asn1_paths] || ["asn1"] + dest_paths = project[:asn1_target] || ["src"] + mappings = Enum.zip(source_paths, dest_paths) + options = project[:asn1_options] || [] + + Erlang.compile(manifest(), mappings, :asn1, :erl, opts[:force], fn + input, output -> + options = options ++ [:noobj, outdir: Erlang.to_erl_file(Path.dirname(output))] + result = :asn1ct.compile(Erlang.to_erl_file(input), options) + :ok + end) + end + + def manifests, do: [manifest] + defp manifest, do: Path.join(Mix.Project.manifest_path, @manifest) + + def clean, do: Erlang.clean(manifest()) +end