2016-12-27 10:44:07 +01:00
|
|
|
%%%----------------------------------------------------------------------
|
|
|
|
%%%
|
2023-01-09 17:09:06 +01:00
|
|
|
%%% ejabberd, Copyright (C) 2002-2023 ProcessOne
|
2016-12-27 10:44:07 +01:00
|
|
|
%%%
|
|
|
|
%%% This program is free software; you can redistribute it and/or
|
|
|
|
%%% modify it under the terms of the GNU General Public License as
|
|
|
|
%%% published by the Free Software Foundation; either version 2 of the
|
|
|
|
%%% License, or (at your option) any later version.
|
|
|
|
%%%
|
|
|
|
%%% This program is distributed in the hope that it will be useful,
|
|
|
|
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
%%% General Public License for more details.
|
|
|
|
%%%
|
|
|
|
%%% You should have received a copy of the GNU General Public License along
|
|
|
|
%%% with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
%%%
|
|
|
|
%%%----------------------------------------------------------------------
|
2015-12-18 17:17:13 +01:00
|
|
|
|
2023-06-06 17:36:06 +02:00
|
|
|
%%%
|
|
|
|
%%% Dependencies
|
|
|
|
%%%
|
|
|
|
|
2021-01-13 03:22:41 +01:00
|
|
|
{deps, [{base64url, ".*", {git, "https://github.com/dvv/base64url", {tag, "1.0.1"}}},
|
2022-05-02 12:49:59 +02:00
|
|
|
{cache_tab, ".*", {git, "https://github.com/processone/cache_tab", {tag, "1.0.30"}}},
|
|
|
|
{eimp, ".*", {git, "https://github.com/processone/eimp", {tag, "1.0.22"}}},
|
2021-01-22 12:58:44 +01:00
|
|
|
{if_var_true, tools,
|
2021-01-22 13:39:02 +01:00
|
|
|
{ejabberd_po, ".*", {git, "https://github.com/processone/ejabberd-po", {branch, "main"}}}},
|
2020-07-23 16:30:15 +02:00
|
|
|
{if_var_true, elixir,
|
2021-07-22 15:47:35 +02:00
|
|
|
{elixir, ".*", {git, "https://github.com/elixir-lang/elixir", {tag, "v1.4.4"}}}},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_var_true, pam,
|
2023-01-17 11:22:07 +01:00
|
|
|
{epam, ".*", {git, "https://github.com/processone/epam", {tag, "1.0.14"}}}},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_var_true, redis,
|
2021-05-27 16:55:59 +02:00
|
|
|
{eredis, ".*", {git, "https://github.com/wooga/eredis", {tag, "v1.2.0"}}}},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_var_true, sip,
|
2023-01-17 11:22:07 +01:00
|
|
|
{esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.49"}}}},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_var_true, zlib,
|
2022-05-02 12:49:59 +02:00
|
|
|
{ezlib, ".*", {git, "https://github.com/processone/ezlib", {tag, "1.0.12"}}}},
|
2022-10-12 12:44:27 +02:00
|
|
|
{fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.16"}}},
|
2022-05-02 12:49:59 +02:00
|
|
|
{fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.49"}}},
|
2023-01-17 11:22:07 +01:00
|
|
|
{fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.36"}}},
|
2020-07-22 13:49:35 +02:00
|
|
|
{idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}},
|
2022-02-23 21:52:09 +01:00
|
|
|
{if_version_above, "19",
|
2022-05-02 13:56:16 +02:00
|
|
|
{jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.1.1"}}},
|
|
|
|
{jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.1.0"}}} % for R19 and below
|
2022-02-23 21:52:09 +01:00
|
|
|
},
|
2022-12-16 12:54:25 +01:00
|
|
|
{if_version_above, "20",
|
|
|
|
{jose, ".*", {git, "https://github.com/potatosalad/erlang-jose", {tag, "1.11.5"}}},
|
|
|
|
{jose, ".*", {git, "https://github.com/potatosalad/erlang-jose", {tag, "1.11.1"}}}
|
|
|
|
},
|
2022-02-08 12:12:49 +01:00
|
|
|
{if_version_below, "22",
|
|
|
|
{lager, ".*", {git, "https://github.com/erlang-lager/lager", {tag, "3.9.1"}}}
|
|
|
|
},
|
2021-03-08 13:53:37 +01:00
|
|
|
{if_var_true, lua,
|
2022-01-04 21:46:40 +01:00
|
|
|
{if_not_rebar3,
|
|
|
|
{luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0"}}}
|
|
|
|
}},
|
|
|
|
{if_var_true, lua,
|
|
|
|
{if_rebar3,
|
|
|
|
{luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0.0"}}}
|
|
|
|
}},
|
2022-05-02 12:49:59 +02:00
|
|
|
{mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.15"}}},
|
2023-01-17 11:22:07 +01:00
|
|
|
{p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.22"}}},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_var_true, mysql,
|
2023-07-25 16:52:49 +02:00
|
|
|
{p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", "150c15b96d2fb84cb00e07cc53cd97ec72b77efc"}}},
|
2022-05-02 12:49:59 +02:00
|
|
|
{p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.11"}}},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_var_true, pgsql,
|
2023-04-18 11:22:33 +02:00
|
|
|
{p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.22"}}}},
|
2022-05-02 12:49:59 +02:00
|
|
|
{p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.25"}}},
|
|
|
|
{pkix, ".*", {git, "https://github.com/processone/pkix", {tag, "1.0.9"}}},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_not_rebar3, %% Needed because modules are not fully migrated to new structure and mix
|
|
|
|
{if_var_true, elixir,
|
|
|
|
{rebar_elixir_plugin, ".*", {git, "https://github.com/processone/rebar_elixir_plugin", "0.1.0"}}}},
|
|
|
|
{if_var_true, sqlite,
|
2023-01-17 11:22:07 +01:00
|
|
|
{sqlite3, ".*", {git, "https://github.com/processone/erlang-sqlite3", {tag, "1.1.14"}}}},
|
2022-10-12 12:44:27 +02:00
|
|
|
{stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.29"}}},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_var_true, stun,
|
2023-01-17 11:22:07 +01:00
|
|
|
{stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.2.7"}}}},
|
2023-08-02 17:48:14 +02:00
|
|
|
{xmpp, ".*", {git, "https://github.com/processone/xmpp", "3d3d98b996dd7569c57df5fb966b9dfb985c58f3"}},
|
2023-01-17 11:22:07 +01:00
|
|
|
{yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.15"}}}
|
2020-07-22 13:49:35 +02:00
|
|
|
]}.
|
2015-12-18 17:17:13 +01:00
|
|
|
|
2022-01-04 21:22:11 +01:00
|
|
|
{gitonly_deps, [elixir]}.
|
2020-09-21 13:49:58 +02:00
|
|
|
|
2015-12-18 17:20:18 +01:00
|
|
|
{if_var_true, latest_deps,
|
2016-02-03 16:26:15 +01:00
|
|
|
{floating_deps, [cache_tab,
|
2020-07-22 13:49:35 +02:00
|
|
|
eimp,
|
|
|
|
epam,
|
|
|
|
esip,
|
|
|
|
ezlib,
|
2016-02-03 16:13:16 +01:00
|
|
|
fast_tls,
|
2016-02-03 19:03:17 +01:00
|
|
|
fast_xml,
|
2016-02-03 10:55:40 +01:00
|
|
|
fast_yaml,
|
2020-07-22 13:49:35 +02:00
|
|
|
mqtree,
|
|
|
|
p1_acme,
|
2015-12-18 17:20:18 +01:00
|
|
|
p1_mysql,
|
2017-07-25 17:59:32 +02:00
|
|
|
p1_oauth2,
|
2020-07-22 13:49:35 +02:00
|
|
|
p1_pgsql,
|
|
|
|
p1_utils,
|
2019-08-02 16:06:19 +02:00
|
|
|
pkix,
|
2020-06-03 13:43:10 +02:00
|
|
|
sqlite3,
|
2020-07-22 13:49:35 +02:00
|
|
|
stringprep,
|
|
|
|
stun,
|
|
|
|
xmpp,
|
|
|
|
yconf]}}.
|
2015-12-18 17:20:18 +01:00
|
|
|
|
2023-06-06 17:36:06 +02:00
|
|
|
%%%
|
|
|
|
%%% Compile
|
|
|
|
%%%
|
|
|
|
|
2023-06-06 17:33:34 +02:00
|
|
|
{recursive_cmds, ['configure-deps']}.
|
|
|
|
|
|
|
|
{post_hook_configure, [{"eimp", []},
|
|
|
|
{if_var_true, pam, {"epam", []}},
|
|
|
|
{if_var_true, sip, {"esip", []}},
|
|
|
|
{if_var_true, zlib, {"ezlib", []}},
|
|
|
|
{"fast_tls", []},
|
|
|
|
{"fast_xml", [{if_var_true, full_xml, "--enable-full-xml"}]},
|
|
|
|
{"fast_yaml", []},
|
|
|
|
{"stringprep", []}]}.
|
|
|
|
|
2017-12-07 10:47:23 +01:00
|
|
|
{erl_first_files, ["src/ejabberd_sql_pt.erl", "src/ejabberd_config.erl",
|
2017-12-26 16:55:57 +01:00
|
|
|
"src/gen_mod.erl", "src/mod_muc_room.erl",
|
|
|
|
"src/mod_push.erl", "src/xmpp_socket.erl"]}.
|
2016-03-04 11:32:23 +01:00
|
|
|
|
2015-12-18 17:17:13 +01:00
|
|
|
{erl_opts, [nowarn_deprecated_function,
|
2016-11-19 11:03:33 +01:00
|
|
|
{i, "include"},
|
2018-12-13 11:45:45 +01:00
|
|
|
{if_version_above, "20", {d, 'DEPRECATED_GET_STACKTRACE'}},
|
2022-02-24 21:34:40 +01:00
|
|
|
{if_version_above, "20", {d, 'HAVE_ERL_ERROR'}},
|
|
|
|
{if_version_above, "20", {d, 'HAVE_URI_STRING'}},
|
2020-06-01 10:35:28 +02:00
|
|
|
{if_version_below, "21", {d, 'USE_OLD_HTTP_URI'}},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_version_below, "22", {d, 'LAGER'}},
|
2021-02-15 14:29:58 +01:00
|
|
|
{if_version_below, "21", {d, 'NO_CUSTOMIZE_HOSTNAME_CHECK'}},
|
2020-06-01 10:35:28 +02:00
|
|
|
{if_version_below, "23", {d, 'USE_OLD_CRYPTO_HMAC'}},
|
|
|
|
{if_version_below, "23", {d, 'USE_OLD_PG2'}},
|
2021-03-04 15:30:06 +01:00
|
|
|
{if_version_below, "24", {d, 'COMPILER_REPORTS_ONLY_LINES'}},
|
2021-04-10 17:32:55 +02:00
|
|
|
{if_version_below, "24", {d, 'SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL'}},
|
2022-08-17 17:28:31 +02:00
|
|
|
{if_version_below, "25", {d, 'OTP_BELOW_25'}},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_var_false, debug, no_debug_info},
|
|
|
|
{if_var_true, debug, debug_info},
|
2016-09-08 16:29:19 +02:00
|
|
|
{if_var_true, elixir, {d, 'ELIXIR_ENABLED'}},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_var_true, new_sql_schema, {d, 'NEW_SQL_SCHEMA'}},
|
2022-02-08 14:14:00 +01:00
|
|
|
{if_var_true, roster_gateway_workaround, {d, 'ROSTER_GATEWAY_WORKAROUND'}},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_var_true, sip, {d, 'SIP'}},
|
|
|
|
{if_var_true, stun, {d, 'STUN'}},
|
2018-07-06 00:07:36 +02:00
|
|
|
{src_dirs, [src,
|
2021-02-08 13:02:50 +01:00
|
|
|
{if_rebar3, sql},
|
2015-12-18 17:17:13 +01:00
|
|
|
{if_var_true, tools, tools},
|
|
|
|
{if_var_true, elixir, include}]}]}.
|
|
|
|
|
2017-01-26 16:43:47 +01:00
|
|
|
{if_rebar3, {plugins, [rebar3_hex, {provider_asn1, "0.2.0"}]}}.
|
2020-09-21 13:51:31 +02:00
|
|
|
{if_rebar3, {project_plugins, [configure_deps]}}.
|
2017-01-26 16:43:47 +01:00
|
|
|
{if_not_rebar3, {plugins, [
|
2020-01-08 10:37:09 +01:00
|
|
|
deps_erl_opts, override_deps_versions2, override_opts, configure_deps,
|
2017-12-26 11:16:48 +01:00
|
|
|
{if_var_true, elixir, rebar_elixir_compiler},
|
|
|
|
{if_var_true, elixir, rebar_exunit}
|
|
|
|
]}}.
|
2015-12-18 17:17:13 +01:00
|
|
|
|
2020-09-21 16:14:12 +02:00
|
|
|
{if_rebar3, {if_var_true, elixir,
|
2020-09-23 16:52:21 +02:00
|
|
|
{project_app_dirs, [".", "elixir/lib"]}}}.
|
2020-09-21 16:14:12 +02:00
|
|
|
{if_not_rebar3, {if_var_true, elixir,
|
|
|
|
{lib_dirs, ["deps/elixir/lib"]}}}.
|
2016-02-25 12:16:47 +01:00
|
|
|
{if_var_true, elixir,
|
|
|
|
{src_dirs, ["include"]}}.
|
2015-12-18 17:17:13 +01:00
|
|
|
|
|
|
|
{sub_dirs, ["rel"]}.
|
|
|
|
|
|
|
|
{keep_build_info, true}.
|
|
|
|
|
2023-06-06 17:36:06 +02:00
|
|
|
%%%
|
|
|
|
%%% Test
|
|
|
|
%%%
|
|
|
|
|
2015-12-18 17:17:13 +01:00
|
|
|
{xref_warnings, false}.
|
|
|
|
|
2023-06-06 13:38:22 +02:00
|
|
|
{if_rebar3,
|
|
|
|
{xref_checks,
|
|
|
|
[deprecated_function_calls, deprecated_functions, locals_not_used,
|
|
|
|
undefined_function_calls, undefined_functions]}
|
|
|
|
}.
|
|
|
|
{if_not_rebar3,
|
|
|
|
{xref_checks,
|
|
|
|
[deprecated_function_calls, deprecated_functions,
|
|
|
|
undefined_function_calls, undefined_functions]}
|
|
|
|
}.
|
2015-12-18 17:17:13 +01:00
|
|
|
|
|
|
|
{xref_exclusions, [
|
|
|
|
"(\"gen_transport\":_/_)",
|
|
|
|
"(\"eprof\":_/_)",
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_var_false, elixir, "(\"Elixir.*\":_/_)"},
|
2015-12-18 17:17:13 +01:00
|
|
|
{if_var_false, http, "(\"lhttpc\":_/_)"},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_var_false, mysql, "(\".*mysql.*\":_/_)"},
|
2015-12-18 17:17:13 +01:00
|
|
|
{if_var_false, odbc, "(\"odbc\":_/_)"},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_var_false, pam, "(\"epam\":_/_)"},
|
|
|
|
{if_var_false, pgsql, "(\".*pgsql.*\":_/_)"},
|
|
|
|
{if_var_false, redis, "(\"eredis\":_/_)"},
|
2015-12-18 17:17:13 +01:00
|
|
|
{if_var_false, sqlite, "(\"sqlite3\":_/_)"},
|
2020-07-22 13:49:35 +02:00
|
|
|
{if_var_false, zlib, "(\"ezlib\":_/_)"}]}.
|
2015-12-18 17:17:13 +01:00
|
|
|
|
2023-06-06 13:38:22 +02:00
|
|
|
{xref_ignores, [{eldap_filter_yecc, return_error, 2} ]}.
|
|
|
|
|
2016-11-19 11:03:33 +01:00
|
|
|
{eunit_compile_opts, [{i, "tools"},
|
2020-09-23 16:52:21 +02:00
|
|
|
{i, "include"}]}.
|
2015-12-18 17:17:13 +01:00
|
|
|
|
2023-06-06 13:38:22 +02:00
|
|
|
{dialyzer, [{get_warnings, false}, % Show warnings of dependencies
|
|
|
|
{if_version_above, "25",
|
|
|
|
{plt_extra_apps,
|
|
|
|
[asn1, odbc, public_key, stdlib, syntax_tools,
|
|
|
|
eredis, idna, jiffy, luerl, jose,
|
|
|
|
cache_tab, eimp, epam, esip, ezlib, fast_tls, fast_xml, fast_yaml,
|
|
|
|
mqtree, p1_acme, p1_mysql, p1_oauth2, p1_pgsql, p1_utils, pkix,
|
|
|
|
sqlite3, stringprep, stun, xmpp, yconf]},
|
|
|
|
{plt_extra_apps, % For Erlang/OTP 25 and older
|
|
|
|
[cache_tab, eimp, epam, esip, ezlib, fast_tls, fast_xml, fast_yaml,
|
|
|
|
mqtree, p1_acme, p1_mysql, p1_oauth2, p1_pgsql, p1_utils, pkix,
|
|
|
|
sqlite3, stringprep, stun, xmpp, yconf]}
|
|
|
|
} ]}.
|
|
|
|
|
|
|
|
{ct_opts, [{keep_logs, 20}]}.
|
|
|
|
|
2018-12-13 11:46:46 +01:00
|
|
|
{cover_enabled, true}.
|
2016-03-21 12:01:20 +01:00
|
|
|
{cover_export_enabled, true}.
|
2021-05-25 18:31:47 +02:00
|
|
|
{coveralls_coverdata, "_build/test/cover/ct.coverdata"}.
|
|
|
|
{coveralls_service_name, "github"}.
|
2015-12-18 17:17:13 +01:00
|
|
|
|
2023-06-06 17:36:06 +02:00
|
|
|
%%%
|
|
|
|
%%% OTP Release
|
|
|
|
%%%
|
|
|
|
|
2021-06-25 12:32:40 +02:00
|
|
|
{relx, [{release, {ejabberd, {cmd, "grep {vsn, vars.config | sed 's|{vsn, \"||;s|\"}.||' | tr -d '\012'"}},
|
2021-06-27 17:08:21 +02:00
|
|
|
[ejabberd]},
|
2021-06-25 12:32:40 +02:00
|
|
|
{sys_config, "./rel/sys.config"},
|
|
|
|
{vm_args, "./rel/vm.args"},
|
|
|
|
{overlay_vars, "vars.config"},
|
2022-04-25 12:46:48 +02:00
|
|
|
{overlay, [{mkdir, "logs"},
|
|
|
|
{mkdir, "database"},
|
|
|
|
{mkdir, "conf"},
|
2021-12-23 14:24:27 +01:00
|
|
|
{copy, "rel/files/erl", "erts-\{\{erts_vsn\}\}/bin/erl"},
|
2021-06-25 12:32:40 +02:00
|
|
|
{template, "ejabberdctl.template", "bin/ejabberdctl"},
|
2022-04-25 12:46:48 +02:00
|
|
|
{copy, "inetrc", "conf/inetrc"},
|
2021-06-25 16:24:08 +02:00
|
|
|
{copy, "tools/captcha*.sh", "lib/ejabberd-\{\{release_version\}\}/priv/bin/"},
|
2021-06-25 12:32:40 +02:00
|
|
|
{copy, "rel/files/install_upgrade.escript", "bin/install_upgrade.escript"}]}
|
|
|
|
]}.
|
|
|
|
|
2021-07-01 13:57:48 +02:00
|
|
|
{profiles, [{prod, [{relx, [{debug_info, strip},
|
|
|
|
{dev_mode, false},
|
|
|
|
{include_erts, true},
|
|
|
|
{include_src, true},
|
2021-12-23 13:30:44 +01:00
|
|
|
{generate_start_script, false},
|
2021-06-25 12:32:40 +02:00
|
|
|
{overlay, [{copy, "sql/*", "lib/ejabberd-\{\{release_version\}\}/priv/sql/"},
|
2022-04-25 12:46:48 +02:00
|
|
|
{copy, "ejabberdctl.cfg.example", "conf/ejabberdctl.cfg"},
|
|
|
|
{copy, "ejabberd.yml.example", "conf/ejabberd.yml"}]}]}]},
|
2021-06-25 12:40:26 +02:00
|
|
|
{dev, [{post_hooks, [{release, "rel/setup-dev.sh"}]},
|
2021-07-01 13:57:48 +02:00
|
|
|
{relx, [{debug_info, keep},
|
|
|
|
{dev_mode, true},
|
2021-06-25 12:40:26 +02:00
|
|
|
{include_erts, true},
|
|
|
|
{include_src, false},
|
2021-12-23 13:30:44 +01:00
|
|
|
{generate_start_script, true},
|
|
|
|
{extended_start_script, true},
|
2022-04-25 12:46:48 +02:00
|
|
|
{overlay, [{copy, "ejabberdctl.cfg.example", "conf/ejabberdctl.cfg.example"},
|
|
|
|
{copy, "ejabberd.yml.example", "conf/ejabberd.yml.example"},
|
|
|
|
{copy, "test/ejabberd_SUITE_data/ca.pem", "conf/"},
|
|
|
|
{copy, "test/ejabberd_SUITE_data/cert.pem", "conf/"}]}]}]},
|
2021-06-25 12:32:40 +02:00
|
|
|
{test, [{erl_opts, [nowarn_export_all]}]}]}.
|
2021-06-25 12:40:26 +02:00
|
|
|
|
2022-01-17 11:49:16 +01:00
|
|
|
{alias, [{relive, [{shell, "--apps ejabberd \
|
|
|
|
--config rel/relive.config \
|
|
|
|
--script rel/relive.escript \
|
|
|
|
--name ejabberd@localhost"}]}
|
|
|
|
]}.
|
|
|
|
|
2016-02-03 11:00:12 +01:00
|
|
|
%% Local Variables:
|
|
|
|
%% mode: erlang
|
|
|
|
%% End:
|
2016-02-03 11:10:11 +01:00
|
|
|
%% vim: set filetype=erlang tabstop=8:
|