1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
defmodule Ejabberd.Mixfile do
use Mix.Project
def project do
[app: :ejabberd,
version: "@PACKAGE_VERSION@",
elixir: "~> 1.0",
elixirc_paths: ["lib"],
compile_path: ".",
compilers: [:asn1] ++ Mix.compilers,
erlc_options: erlc_options,
erlc_paths: ["asn1", "src"],
deps: deps]
end
def application do
[mod: {:ejabberd_app, []},
applications: [:kernel, :stdlib]]
end
defp erlc_options do
includes = Path.wildcard(Path.join("..", "/*/include"))
[:debug_info, {:d, :NO_EXT_LIB}] ++ Enum.map(includes, fn(path) -> {:i, path} end)
end
defp deps do
[
{:p1_xml, github: "processone/xml"},
{:p1_logger, github: "processone/p1_logger"},
{:p1_yaml, github: "processone/p1_yaml"},
{:p1_tls, github: "processone/tls"},
{:p1_stringprep, github: "processone/stringprep"},
{:p1_zlib, github: "processone/zlib"},
{: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"},
{:ehyperloglog, github: "vaxelfel/eHyperLogLog"},
{:p1_mysql, github: "processone/mysql"},
{:p1_pgsql, github: "processone/pgsql"},
{:eredis, github: "wooga/eredis"}
]
end
end
defmodule Mix.Tasks.Compile.Asn1 do
use Mix.Task
alias Mix.Compilers.Erlang
@recursive true
@manifest ".compile.asn1"
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))]
case :asn1ct.compile(Erlang.to_erl_file(input), options) do
:ok -> {:ok, :done}
error -> error
end
end)
end
def manifests, do: [manifest]
defp manifest, do: Path.join(Mix.Project.manifest_path, @manifest)
def clean, do: Erlang.clean(manifest())
end
|