summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMickael Remond <mremond@process-one.net>2015-04-04 17:42:12 +0200
committerMickael Remond <mremond@process-one.net>2015-04-04 17:42:12 +0200
commitea8db9967fbfe53f581c3ae721657d9e6f919864 (patch)
tree1998f2625b14fc4b5855d7c806b34700c13f52e6 /lib
parentReplace crypto calls that will be removed in a future release (diff)
ejabberd can be embedded in an Elixir application
Diffstat (limited to 'lib')
-rw-r--r--lib/mix/tasks/compile.asn1.ex53
1 files changed, 53 insertions, 0 deletions
diff --git a/lib/mix/tasks/compile.asn1.ex b/lib/mix/tasks/compile.asn1.ex
new file mode 100644
index 00000000..e1af6046
--- /dev/null
+++ b/lib/mix/tasks/compile.asn1.ex
@@ -0,0 +1,53 @@
+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