aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/ci.yaml361
-rw-r--r--.gitignore3
-rw-r--r--CHANGELOG.asciidoc103
-rw-r--r--Makefile22
-rw-r--r--README.asciidoc2
-rw-r--r--README.legacy.md13
-rw-r--r--build.config7
-rw-r--r--core/beam-cache.mk42
-rw-r--r--core/compat.mk10
-rw-r--r--core/core.mk23
-rw-r--r--core/deps-tools.mk20
-rw-r--r--core/deps.mk507
-rw-r--r--core/elixir.mk201
-rw-r--r--core/erlc.mk58
-rw-r--r--core/index.mk8
-rw-r--r--core/kerl.mk31
-rw-r--r--core/test.mk9
-rw-r--r--doc/src/guide/book.asciidoc2
-rw-r--r--doc/src/guide/ci.asciidoc11
-rw-r--r--doc/src/guide/common_test.asciidoc6
-rw-r--r--doc/src/guide/coverage.asciidoc11
-rw-r--r--doc/src/guide/deps.asciidoc30
-rw-r--r--doc/src/guide/elixir.asciidoc86
-rw-r--r--doc/src/guide/external_plugins.asciidoc28
-rw-r--r--doc/src/guide/getting_started.asciidoc22
-rw-r--r--doc/src/guide/installation.asciidoc6
-rw-r--r--doc/src/guide/ports.asciidoc2
-rw-r--r--doc/src/guide/releases.asciidoc19
-rw-r--r--doc/src/guide/xref.asciidoc181
-rw-r--r--index/aberth.mk7
-rw-r--r--index/active.mk7
-rw-r--r--index/actordb_core.mk7
-rw-r--r--index/actordb_thrift.mk7
-rw-r--r--index/aleppo.mk7
-rw-r--r--index/alog.mk7
-rw-r--r--index/amqp_client.mk7
-rw-r--r--index/annotations.mk7
-rw-r--r--index/antidote.mk7
-rw-r--r--index/apns.mk7
-rw-r--r--index/azdht.mk7
-rw-r--r--index/backoff.mk7
-rw-r--r--index/barrel_tcp.mk7
-rw-r--r--index/basho_bench.mk7
-rw-r--r--index/bcrypt.mk7
-rw-r--r--index/beam.mk7
-rw-r--r--index/beanstalk.mk7
-rw-r--r--index/bear.mk7
-rw-r--r--index/bertconf.mk7
-rw-r--r--index/bifrost.mk7
-rw-r--r--index/binpp.mk7
-rw-r--r--index/bisect.mk7
-rw-r--r--index/bitcask.mk7
-rw-r--r--index/bitstore.mk7
-rw-r--r--index/bootstrap.mk7
-rw-r--r--index/boss.mk7
-rw-r--r--index/boss_db.mk7
-rw-r--r--index/brod.mk7
-rw-r--r--index/bson.mk7
-rw-r--r--index/bullet.mk7
-rw-r--r--index/cache.mk7
-rw-r--r--index/cake.mk7
-rw-r--r--index/carotene.mk7
-rw-r--r--index/cberl.mk7
-rw-r--r--index/cecho.mk7
-rw-r--r--index/cferl.mk7
-rw-r--r--index/chaos_monkey.mk7
-rw-r--r--index/check_node.mk7
-rw-r--r--index/chronos.mk7
-rw-r--r--index/chumak.mk7
-rw-r--r--index/cl.mk7
-rw-r--r--index/clique.mk7
-rw-r--r--index/cloudi_core.mk7
-rw-r--r--index/cloudi_service_api_requests.mk7
-rw-r--r--index/cloudi_service_db.mk7
-rw-r--r--index/cloudi_service_db_cassandra.mk7
-rw-r--r--index/cloudi_service_db_cassandra_cql.mk7
-rw-r--r--index/cloudi_service_db_couchdb.mk7
-rw-r--r--index/cloudi_service_db_elasticsearch.mk7
-rw-r--r--index/cloudi_service_db_memcached.mk7
-rw-r--r--index/cloudi_service_db_mysql.mk7
-rw-r--r--index/cloudi_service_db_pgsql.mk7
-rw-r--r--index/cloudi_service_db_riak.mk7
-rw-r--r--index/cloudi_service_db_tokyotyrant.mk7
-rw-r--r--index/cloudi_service_filesystem.mk7
-rw-r--r--index/cloudi_service_http_client.mk7
-rw-r--r--index/cloudi_service_http_cowboy.mk7
-rw-r--r--index/cloudi_service_http_elli.mk7
-rw-r--r--index/cloudi_service_map_reduce.mk7
-rw-r--r--index/cloudi_service_oauth1.mk7
-rw-r--r--index/cloudi_service_queue.mk7
-rw-r--r--index/cloudi_service_quorum.mk7
-rw-r--r--index/cloudi_service_router.mk7
-rw-r--r--index/cloudi_service_tcp.mk7
-rw-r--r--index/cloudi_service_timers.mk7
-rw-r--r--index/cloudi_service_udp.mk7
-rw-r--r--index/cloudi_service_validate.mk7
-rw-r--r--index/cloudi_service_zeromq.mk7
-rw-r--r--index/cluster_info.mk7
-rw-r--r--index/color.mk7
-rw-r--r--index/confetti.mk7
-rw-r--r--index/couchbeam.mk7
-rw-r--r--index/covertool.mk7
-rw-r--r--index/cowboy.mk2
-rw-r--r--index/cowdb.mk7
-rw-r--r--index/cowlib.mk2
-rw-r--r--index/cpg.mk7
-rw-r--r--index/cqerl.mk7
-rw-r--r--index/cr.mk7
-rw-r--r--index/cuttlefish.mk7
-rw-r--r--index/damocles.mk7
-rw-r--r--index/debbie.mk7
-rw-r--r--index/decimal.mk7
-rw-r--r--index/detergent.mk7
-rw-r--r--index/detest.mk7
-rw-r--r--index/dh_date.mk7
-rw-r--r--index/dirbusterl.mk7
-rw-r--r--index/dispcount.mk7
-rw-r--r--index/dlhttpc.mk7
-rw-r--r--index/dns.mk7
-rw-r--r--index/dnssd.mk7
-rw-r--r--index/dynamic_compile.mk7
-rw-r--r--index/e2.mk7
-rw-r--r--index/eamf.mk7
-rw-r--r--index/eavro.mk7
-rw-r--r--index/ecapnp.mk7
-rw-r--r--index/econfig.mk7
-rw-r--r--index/edate.mk7
-rw-r--r--index/edgar.mk7
-rw-r--r--index/edis.mk7
-rw-r--r--index/edns.mk7
-rw-r--r--index/edown.mk7
-rw-r--r--index/eep.mk7
-rw-r--r--index/eep_app.mk7
-rw-r--r--index/efene.mk7
-rw-r--r--index/egeoip.mk7
-rw-r--r--index/ehsa.mk7
-rw-r--r--index/ej.mk7
-rw-r--r--index/ejabberd.mk7
-rw-r--r--index/ejwt.mk7
-rw-r--r--index/ekaf.mk7
-rw-r--r--index/elarm.mk7
-rw-r--r--index/eleveldb.mk7
-rw-r--r--index/elixir.mk6
-rw-r--r--index/elli.mk7
-rw-r--r--index/elvis.mk7
-rw-r--r--index/emagick.mk7
-rw-r--r--index/emysql.mk7
-rw-r--r--index/enm.mk7
-rw-r--r--index/entop.mk7
-rw-r--r--index/epcap.mk7
-rw-r--r--index/eper.mk7
-rw-r--r--index/epgsql.mk7
-rw-r--r--index/episcina.mk7
-rw-r--r--index/eplot.mk7
-rw-r--r--index/epocxy.mk7
-rw-r--r--index/epubnub.mk7
-rw-r--r--index/eqm.mk7
-rw-r--r--index/eredis.mk7
-rw-r--r--index/eredis_pool.mk7
-rw-r--r--index/erl_streams.mk7
-rw-r--r--index/erlang_cep.mk7
-rw-r--r--index/erlang_js.mk7
-rw-r--r--index/erlang_localtime.mk7
-rw-r--r--index/erlang_smtp.mk7
-rw-r--r--index/erlang_term.mk7
-rw-r--r--index/erlastic_search.mk7
-rw-r--r--index/erlasticsearch.mk7
-rw-r--r--index/erlbrake.mk7
-rw-r--r--index/erlcloud.mk7
-rw-r--r--index/erlcron.mk7
-rw-r--r--index/erldb.mk7
-rw-r--r--index/erldis.mk7
-rw-r--r--index/erldns.mk7
-rw-r--r--index/erldocker.mk7
-rw-r--r--index/erlfsmon.mk7
-rw-r--r--index/erlgit.mk7
-rw-r--r--index/erlguten.mk7
-rw-r--r--index/erlmc.mk7
-rw-r--r--index/erlmongo.mk7
-rw-r--r--index/erlog.mk7
-rw-r--r--index/erlpass.mk7
-rw-r--r--index/erlport.mk7
-rw-r--r--index/erlsh.mk7
-rw-r--r--index/erlsha2.mk7
-rw-r--r--index/erlsom.mk7
-rw-r--r--index/erlubi.mk7
-rw-r--r--index/erlvolt.mk7
-rw-r--r--index/erlware_commons.mk7
-rw-r--r--index/errd.mk7
-rw-r--r--index/erserve.mk7
-rw-r--r--index/erwa.mk7
-rw-r--r--index/escalus.mk7
-rw-r--r--index/esh_mk.mk7
-rw-r--r--index/espec.mk7
-rw-r--r--index/estatsd.mk7
-rw-r--r--index/etap.mk7
-rw-r--r--index/etest.mk7
-rw-r--r--index/etest_http.mk7
-rw-r--r--index/etoml.mk7
-rw-r--r--index/eunit.mk7
-rw-r--r--index/eunit_formatters.mk7
-rw-r--r--index/euthanasia.mk7
-rw-r--r--index/evum.mk7
-rw-r--r--index/exec.mk7
-rw-r--r--index/exml.mk7
-rw-r--r--index/exometer.mk7
-rw-r--r--index/exs1024.mk7
-rw-r--r--index/exs64.mk7
-rw-r--r--index/exsplus116.mk7
-rw-r--r--index/exsplus128.mk7
-rw-r--r--index/ezmq.mk7
-rw-r--r--index/ezmtp.mk7
-rw-r--r--index/fast_disk_log.mk7
-rw-r--r--index/feeder.mk7
-rw-r--r--index/find_crate.mk7
-rw-r--r--index/fix.mk7
-rw-r--r--index/flower.mk7
-rw-r--r--index/fn.mk7
-rw-r--r--index/folsom.mk7
-rw-r--r--index/folsom_cowboy.mk7
-rw-r--r--index/folsomite.mk7
-rw-r--r--index/fs.mk7
-rw-r--r--index/fuse.mk7
-rw-r--r--index/gcm.mk7
-rw-r--r--index/gcprof.mk7
-rw-r--r--index/geas.mk7
-rw-r--r--index/geef.mk7
-rw-r--r--index/gen_coap.mk7
-rw-r--r--index/gen_cycle.mk7
-rw-r--r--index/gen_icmp.mk7
-rw-r--r--index/gen_leader.mk7
-rw-r--r--index/gen_nb_server.mk7
-rw-r--r--index/gen_paxos.mk7
-rw-r--r--index/gen_rpc.mk7
-rw-r--r--index/gen_smtp.mk7
-rw-r--r--index/gen_tracker.mk7
-rw-r--r--index/gen_unix.mk7
-rw-r--r--index/geode.mk7
-rw-r--r--index/getopt.mk7
-rw-r--r--index/gettext.mk7
-rw-r--r--index/giallo.mk7
-rw-r--r--index/gin.mk7
-rw-r--r--index/gitty.mk7
-rw-r--r--index/gold_fever.mk7
-rw-r--r--index/gproc.mk7
-rw-r--r--index/grapherl.mk7
-rw-r--r--index/grpc.mk7
-rw-r--r--index/grpc_client.mk7
-rw-r--r--index/gut.mk7
-rw-r--r--index/hackney.mk7
-rw-r--r--index/hamcrest.mk7
-rw-r--r--index/hanoidb.mk7
-rw-r--r--index/hex_core.mk8
-rw-r--r--index/hottub.mk7
-rw-r--r--index/hpack.mk7
-rw-r--r--index/hyper.mk7
-rw-r--r--index/i18n.mk7
-rw-r--r--index/ibrowse.mk7
-rw-r--r--index/idna.mk7
-rw-r--r--index/ierlang.mk7
-rw-r--r--index/iota.mk7
-rw-r--r--index/irc_lib.mk7
-rw-r--r--index/ircd.mk7
-rw-r--r--index/iris.mk7
-rw-r--r--index/iso8601.mk7
-rw-r--r--index/jamdb_sybase.mk7
-rw-r--r--index/jerg.mk7
-rw-r--r--index/jesse.mk7
-rw-r--r--index/jiffy.mk7
-rw-r--r--index/jiffy_v.mk7
-rw-r--r--index/jobs.mk7
-rw-r--r--index/joxa.mk7
-rw-r--r--index/json.mk7
-rw-r--r--index/json_rec.mk7
-rw-r--r--index/jsone.mk7
-rw-r--r--index/jsonerl.mk7
-rw-r--r--index/jsonpath.mk7
-rw-r--r--index/jsonx.mk7
-rw-r--r--index/jsx.mk7
-rw-r--r--index/kafka.mk7
-rw-r--r--index/kafka_protocol.mk7
-rw-r--r--index/kai.mk7
-rw-r--r--index/katja.mk7
-rw-r--r--index/kdht.mk7
-rw-r--r--index/key2value.mk7
-rw-r--r--index/keys1value.mk7
-rw-r--r--index/kinetic.mk7
-rw-r--r--index/kjell.mk7
-rw-r--r--index/kraken.mk7
-rw-r--r--index/kucumberl.mk7
-rw-r--r--index/kvc.mk7
-rw-r--r--index/kvlists.mk7
-rw-r--r--index/kvs.mk7
-rw-r--r--index/lager.mk7
-rw-r--r--index/lager_amqp_backend.mk7
-rw-r--r--index/lager_syslog.mk7
-rw-r--r--index/lambdapad.mk7
-rw-r--r--index/lasp.mk7
-rw-r--r--index/lasse.mk7
-rw-r--r--index/ldap.mk7
-rw-r--r--index/lethink.mk7
-rw-r--r--index/lfe.mk7
-rw-r--r--index/ling.mk7
-rw-r--r--index/live.mk7
-rw-r--r--index/lmq.mk7
-rw-r--r--index/locker.mk7
-rw-r--r--index/locks.mk7
-rw-r--r--index/log4erl.mk7
-rw-r--r--index/lol.mk7
-rw-r--r--index/lucid.mk7
-rw-r--r--index/luerl.mk7
-rw-r--r--index/luwak.mk7
-rw-r--r--index/lux.mk7
-rw-r--r--index/machi.mk7
-rw-r--r--index/mad.mk7
-rw-r--r--index/marina.mk7
-rw-r--r--index/mavg.mk7
-rw-r--r--index/mc_erl.mk7
-rw-r--r--index/mcd.mk7
-rw-r--r--index/mcerlang.mk7
-rw-r--r--index/meck.mk7
-rw-r--r--index/mekao.mk7
-rw-r--r--index/memo.mk7
-rw-r--r--index/merge_index.mk7
-rw-r--r--index/merl.mk7
-rw-r--r--index/mimerl.mk7
-rw-r--r--index/mimetypes.mk7
-rw-r--r--index/mixer.mk7
-rw-r--r--index/mochiweb.mk7
-rw-r--r--index/mochiweb_xpath.mk7
-rw-r--r--index/mockgyver.mk7
-rw-r--r--index/modlib.mk7
-rw-r--r--index/mongodb.mk7
-rw-r--r--index/mongooseim.mk7
-rw-r--r--index/moyo.mk7
-rw-r--r--index/msgpack.mk7
-rw-r--r--index/mu2.mk7
-rw-r--r--index/mustache.mk7
-rw-r--r--index/myproto.mk7
-rw-r--r--index/mysql.mk7
-rw-r--r--index/n2o.mk7
-rw-r--r--index/nat_upnp.mk7
-rw-r--r--index/neo4j.mk7
-rw-r--r--index/neotoma.mk7
-rw-r--r--index/newrelic.mk7
-rw-r--r--index/nifty.mk7
-rw-r--r--index/nitrogen_core.mk7
-rw-r--r--index/nkbase.mk7
-rw-r--r--index/nkdocker.mk7
-rw-r--r--index/nkpacket.mk7
-rw-r--r--index/nksip.mk7
-rw-r--r--index/nodefinder.mk7
-rw-r--r--index/nprocreg.mk7
-rw-r--r--index/oauth.mk7
-rw-r--r--index/oauth2.mk7
-rw-r--r--index/observer_cli.mk7
-rw-r--r--index/octopus.mk7
-rw-r--r--index/of_protocol.mk7
-rw-r--r--index/opencouch.mk7
-rw-r--r--index/openflow.mk7
-rw-r--r--index/openid.mk7
-rw-r--r--index/openpoker.mk7
-rw-r--r--index/otpbp.mk7
-rw-r--r--index/pal.mk7
-rw-r--r--index/parse_trans.mk7
-rw-r--r--index/parsexml.mk7
-rw-r--r--index/partisan.mk7
-rw-r--r--index/pegjs.mk7
-rw-r--r--index/percept2.mk7
-rw-r--r--index/pgo.mk7
-rw-r--r--index/pgsql.mk7
-rw-r--r--index/pkgx.mk7
-rw-r--r--index/pkt.mk7
-rw-r--r--index/plain_fsm.mk7
-rw-r--r--index/plumtree.mk7
-rw-r--r--index/pmod_transform.mk7
-rw-r--r--index/pobox.mk7
-rw-r--r--index/ponos.mk7
-rw-r--r--index/poolboy.mk7
-rw-r--r--index/pooler.mk7
-rw-r--r--index/pqueue.mk7
-rw-r--r--index/procket.mk7
-rw-r--r--index/prometheus.mk7
-rw-r--r--index/prop.mk7
-rw-r--r--index/props.mk7
-rw-r--r--index/protobuffs.mk7
-rw-r--r--index/psycho.mk7
-rw-r--r--index/purity.mk7
-rw-r--r--index/push_service.mk7
-rw-r--r--index/qdate.mk7
-rw-r--r--index/qrcode.mk7
-rw-r--r--index/quest.mk7
-rw-r--r--index/quickrand.mk7
-rw-r--r--index/rabbit.mk7
-rw-r--r--index/rabbit_exchange_type_riak.mk7
-rw-r--r--index/rack.mk7
-rw-r--r--index/radierl.mk7
-rw-r--r--index/rafter.mk7
-rw-r--r--index/ranch.mk2
-rw-r--r--index/rbeacon.mk7
-rw-r--r--index/rebar.mk7
-rw-r--r--index/rebus.mk7
-rw-r--r--index/rec2json.mk7
-rw-r--r--index/recon.mk7
-rw-r--r--index/record_info.mk7
-rw-r--r--index/redgrid.mk7
-rw-r--r--index/redo.mk7
-rw-r--r--index/reload_mk.mk7
-rw-r--r--index/reltool_util.mk7
-rw-r--r--index/relx.mk2
-rw-r--r--index/resource_discovery.mk7
-rw-r--r--index/restc.mk7
-rw-r--r--index/rfc4627_jsonrpc.mk7
-rw-r--r--index/riak_control.mk7
-rw-r--r--index/riak_core.mk7
-rw-r--r--index/riak_dt.mk7
-rw-r--r--index/riak_ensemble.mk7
-rw-r--r--index/riak_kv.mk7
-rw-r--r--index/riak_pg.mk7
-rw-r--r--index/riak_pipe.mk7
-rw-r--r--index/riak_sysmon.mk7
-rw-r--r--index/riak_test.mk7
-rw-r--r--index/riakc.mk7
-rw-r--r--index/riakhttpc.mk7
-rw-r--r--index/riaknostic.mk7
-rw-r--r--index/riakpool.mk7
-rw-r--r--index/rivus_cep.mk7
-rw-r--r--index/rlimit.mk7
-rw-r--r--index/rust_mk.mk7
-rw-r--r--index/safetyvalve.mk7
-rw-r--r--index/seestar.mk7
-rw-r--r--index/service.mk7
-rw-r--r--index/setup.mk7
-rw-r--r--index/sext.mk7
-rw-r--r--index/sfmt.mk7
-rw-r--r--index/sgte.mk7
-rw-r--r--index/sheriff.mk7
-rw-r--r--index/shotgun.mk7
-rw-r--r--index/sidejob.mk7
-rw-r--r--index/sieve.mk7
-rw-r--r--index/sighandler.mk7
-rw-r--r--index/simhash.mk7
-rw-r--r--index/simple_bridge.mk7
-rw-r--r--index/simple_oauth2.mk7
-rw-r--r--index/skel.mk7
-rw-r--r--index/slack.mk7
-rw-r--r--index/smother.mk7
-rw-r--r--index/snappyer.mk7
-rw-r--r--index/social.mk7
-rw-r--r--index/spapi_router.mk7
-rw-r--r--index/sqerl.mk7
-rw-r--r--index/srly.mk7
-rw-r--r--index/sshrpc.mk7
-rw-r--r--index/stable.mk7
-rw-r--r--index/statebox.mk7
-rw-r--r--index/statebox_riak.mk7
-rw-r--r--index/statman.mk7
-rw-r--r--index/statsderl.mk7
-rw-r--r--index/stdinout_pool.mk7
-rw-r--r--index/stockdb.mk7
-rw-r--r--index/stripe.mk7
-rw-r--r--index/subproc.mk7
-rw-r--r--index/supervisor3.mk7
-rw-r--r--index/surrogate.mk7
-rw-r--r--index/swab.mk7
-rw-r--r--index/swarm.mk7
-rw-r--r--index/switchboard.mk7
-rw-r--r--index/syn.mk7
-rw-r--r--index/sync.mk7
-rw-r--r--index/syntaxerl.mk7
-rw-r--r--index/syslog.mk7
-rw-r--r--index/taskforce.mk7
-rw-r--r--index/tddreloader.mk7
-rw-r--r--index/tempo.mk7
-rw-r--r--index/ticktick.mk7
-rw-r--r--index/tinymq.mk7
-rw-r--r--index/tinymt.mk7
-rw-r--r--index/tirerl.mk7
-rw-r--r--index/toml.mk7
-rw-r--r--index/traffic_tools.mk7
-rw-r--r--index/trails.mk7
-rw-r--r--index/trane.mk7
-rw-r--r--index/transit.mk7
-rw-r--r--index/trie.mk7
-rw-r--r--index/tunctl.mk7
-rw-r--r--index/twerl.mk7
-rw-r--r--index/twitter_erlang.mk7
-rw-r--r--index/ucol_nif.mk7
-rw-r--r--index/unicorn.mk7
-rw-r--r--index/unsplit.mk7
-rw-r--r--index/uuid.mk7
-rw-r--r--index/ux.mk7
-rw-r--r--index/vert.mk7
-rw-r--r--index/verx.mk7
-rw-r--r--index/vmq_acl.mk7
-rw-r--r--index/vmq_bridge.mk7
-rw-r--r--index/vmq_graphite.mk7
-rw-r--r--index/vmq_passwd.mk7
-rw-r--r--index/vmq_server.mk7
-rw-r--r--index/vmq_snmp.mk7
-rw-r--r--index/vmq_systree.mk7
-rw-r--r--index/vmstats.mk7
-rw-r--r--index/walrus.mk7
-rw-r--r--index/webmachine.mk7
-rw-r--r--index/websocket_client.mk7
-rw-r--r--index/worker_pool.mk7
-rw-r--r--index/wrangler.mk7
-rw-r--r--index/wsock.mk7
-rw-r--r--index/xhttpc.mk7
-rw-r--r--index/xref_runner.mk7
-rw-r--r--index/yamerl.mk7
-rw-r--r--index/yamler.mk7
-rw-r--r--index/yaws.mk7
-rw-r--r--index/zab_engine.mk7
-rw-r--r--index/zabbix_sender.mk7
-rw-r--r--index/zeta.mk7
-rw-r--r--index/zippers.mk7
-rw-r--r--index/zlists.mk7
-rw-r--r--index/zraft_lib.mk7
-rw-r--r--index/zucchini.mk7
-rw-r--r--packages.v2.tsv3
-rwxr-xr-xpkg_add.sh29
-rw-r--r--plugins/asciidoc.mk4
-rw-r--r--plugins/bootstrap.mk473
-rw-r--r--plugins/c_src.mk32
-rw-r--r--plugins/ci.mk26
-rw-r--r--plugins/cover.mk24
-rw-r--r--plugins/ct.mk6
-rw-r--r--plugins/dialyzer.mk4
-rw-r--r--plugins/edoc.mk6
-rw-r--r--plugins/escript.mk46
-rw-r--r--plugins/eunit.mk10
-rw-r--r--plugins/hex.mk59
-rw-r--r--plugins/proper.mk4
-rw-r--r--plugins/protobuffs.mk5
-rw-r--r--plugins/relx.mk105
-rw-r--r--plugins/triq.mk4
-rw-r--r--plugins/xref.mk223
-rwxr-xr-xscrape_hexpm.sh46
-rw-r--r--templates/application.app.src13
-rw-r--r--templates/application.erl11
-rw-r--r--templates/apps_Makefile10
-rw-r--r--templates/cowboy_http_h.erl19
-rw-r--r--templates/cowboy_loop_h.erl18
-rw-r--r--templates/cowboy_rest_h.erl14
-rw-r--r--templates/cowboy_websocket_h.erl31
-rw-r--r--templates/gen_fsm.erl50
-rw-r--r--templates/gen_server.erl42
-rw-r--r--templates/gen_statem.erl42
-rw-r--r--templates/library.app.src11
-rw-r--r--templates/module.erl2
-rw-r--r--templates/ranch_protocol.erl25
-rw-r--r--templates/relx.config6
-rw-r--r--templates/supervisor.erl12
-rw-r--r--templates/sys.config2
-rw-r--r--templates/top_Makefile5
-rw-r--r--templates/vm.args3
-rw-r--r--test/Makefile178
-rw-r--r--test/core_app.mk62
-rw-r--r--test/core_apps.mk12
-rw-r--r--test/core_autopatch.mk41
-rw-r--r--test/core_compat.mk155
-rw-r--r--test/core_deps.mk279
-rw-r--r--test/core_elixir.mk326
-rw-r--r--test/core_makedep.mk46
-rw-r--r--test/core_misc.mk6
-rw-r--r--test/core_plugins.mk45
-rw-r--r--test/core_query.mk8
-rw-r--r--test/core_upgrade.mk8
-rw-r--r--test/hexpm_packages.txt2052
-rw-r--r--test/plugin_asciidoc.mk6
-rw-r--r--test/plugin_bootstrap.mk24
-rw-r--r--test/plugin_c_src.mk77
-rw-r--r--test/plugin_concuerror.mk6
-rw-r--r--test/plugin_cover.mk97
-rw-r--r--test/plugin_ct.mk6
-rw-r--r--test/plugin_dialyzer.mk27
-rw-r--r--test/plugin_edoc.mk71
-rw-r--r--test/plugin_erlydtl.mk6
-rw-r--r--test/plugin_escript.mk47
-rw-r--r--test/plugin_eunit.mk48
-rw-r--r--test/plugin_hex.mk48
-rw-r--r--test/plugin_proper.mk6
-rw-r--r--test/plugin_protobuffs.mk36
-rw-r--r--test/plugin_relx.mk183
-rw-r--r--test/plugin_shell.mk6
-rw-r--r--test/plugin_sphinx.mk8
-rw-r--r--test/plugin_triq.mk6
-rw-r--r--test/plugin_xref.mk312
589 files changed, 6281 insertions, 4623 deletions
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
new file mode 100644
index 0000000..2c8c3b6
--- /dev/null
+++ b/.github/workflows/ci.yaml
@@ -0,0 +1,361 @@
+name: Check Erlang.mk
+
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+ schedule:
+ ## Every Monday at 4am.
+ - cron: 0 4 * * 1
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ check:
+ strategy:
+ fail-fast: false
+ matrix:
+ erlang:
+ - '27'
+ elixir:
+ - '1.17'
+ os:
+# - macos-latest
+ - ubuntu-latest
+# - windows-latest
+ suite:
+ - core-app
+ - core-apps
+ - core-autopatch
+ - core-compat
+ # Trick GH runners into picking this slower job early.
+ - ACME=1 c=core-deps
+ - core-elixir
+ - core-makedep
+ - core-misc
+ - core-plugins
+ - core-query
+ - core-upgrade
+ - asciidoc
+ - bootstrap
+ - concuerror
+ - cover
+ - c-src
+ - ct
+ - dialyzer SET=1
+ - dialyzer SET=2
+ - dialyzer SET=3
+ - dialyzer SET=4
+ - edoc
+ - erlydtl
+ - escript
+ - eunit
+ - proper
+ - protobuffs
+ # Trick GH runners into picking this slower job early.
+ - ACME=1 c=relx
+ - shell
+ - sphinx
+ - triq
+ - xref
+ extra: ['', 'CACHE_DEPS=1', 'LEGACY=1']
+ exclude:
+ # We disable proper/triq tests until ubuntu-latest includes GNU Make 4.4 or later.
+ - os: ubuntu-latest
+ suite: proper
+ - os: ubuntu-latest
+ suite: triq
+ # We disable Concuerror as it doesn't seem to compile on Windows.
+ - os: windows-latest
+ suite: concuerror
+ runs-on: ${{ matrix.os }}
+ steps:
+
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Install Erlang/OTP
+ uses: erlef/setup-beam@v1
+ with:
+ otp-version: ${{ matrix.erlang }}
+ elixir-version: ${{ matrix.elixir }}
+ version-type: loose
+
+ - name: Setup MSYS2 (Windows)
+ if: matrix.os == 'windows-latest'
+ uses: msys2/setup-msys2@v2
+ with:
+ msystem: mingw64
+ release: false
+ update: true
+ install: >-
+ git
+ make
+ mingw-w64-x86_64-gcc
+ gnu-netcat
+ diffutils
+
+ - name: Install libsodium (Linux, Elixir)
+ if: matrix.os == 'ubuntu-latest' && matrix.suite == 'core-elixir'
+ run: sudo apt-get -y install libsodium-dev
+
+ - name: Run tests (Linux)
+ if: matrix.os == 'ubuntu-latest'
+ run: make check c=${{ matrix.suite }} -j4 -k ${{ matrix.extra }}
+
+ - name: Run tests (Windows)
+ if: matrix.os == 'windows-latest'
+ shell: msys2 {0}
+ run: PATH=$INSTALL_DIR_FOR_OTP/bin:$PATH make check c=${{ matrix.suite }} -j4 -k ${{ matrix.extra }}
+
+ - name: Upload artifacts
+ if: failure()
+ uses: actions/upload-artifact@v4
+ with:
+ name: ${{ matrix.os }} OTP-${{ matrix.erlang }} ${{ matrix.suite }} ${{ matrix.extra }}
+ path: |
+ test/test_*/
+
+ check-asdf-elixir:
+ runs-on: ubuntu-latest
+ steps:
+
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Install Erlang/OTP
+ uses: erlef/setup-beam@v1
+ with:
+ otp-version: 27
+ version-type: loose
+
+ - name: Install asdf along with Elixir
+ run: |
+ wget https://github.com/asdf-vm/asdf/releases/download/v0.16.5/asdf-v0.16.5-linux-amd64.tar.gz
+ tar xf asdf-v*-linux-amd64.tar.gz
+ ./asdf plugin add elixir
+ ./asdf install elixir latest
+ ./asdf set elixir latest
+
+ - name: Install libsodium
+ run: sudo apt-get -y install libsodium-dev
+
+ - name: Run tests
+ run: make check c=core-elixir -j4 -k PATH=$PWD:/home/runner/.asdf/shims:$PATH
+
+ check-hex:
+ strategy:
+ fail-fast: false
+ matrix:
+ erlang:
+ - '27'
+ os:
+# - macos-latest
+ - ubuntu-latest
+# - windows-latest
+ extra: ['', 'CACHE_DEPS=1', 'LEGACY=1']
+
+ services:
+ postgres:
+ image: postgres:14
+ env:
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD: postgres
+ POSTGRES_DB: postgres
+ ports:
+ - 5432:5432
+ options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
+ runs-on: ${{ matrix.os }}
+ steps:
+
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Install Erlang/OTP and Elixir
+ uses: erlef/setup-beam@v1
+ with:
+ otp-version: ${{ matrix.erlang }}
+ elixir-version: '1.18'
+ version-type: loose
+
+ - name: Setup MSYS2 (Windows)
+ if: matrix.os == 'windows-latest'
+ uses: msys2/setup-msys2@v2
+ with:
+ msystem: mingw64
+ release: false
+ update: true
+ install: >-
+ git
+ make
+ mingw-w64-x86_64-gcc
+ gnu-netcat
+ diffutils
+
+ - name: Setup local Hexpm
+ run: |
+ git clone https://github.com/hexpm/hexpm
+ cd hexpm
+ perl -ni.bak -e 'print;if ($.==3) {print " user_confirm: false,\n"}' config/dev.exs
+ mix setup
+ mix phx.server &
+
+ - name: Run tests (Linux)
+ if: matrix.os == 'ubuntu-latest'
+ run: make check c=hex -j4 -k ${{ matrix.extra }}
+
+ - name: Run tests (Windows)
+ if: matrix.os == 'windows-latest'
+ shell: msys2 {0}
+ run: PATH=$INSTALL_DIR_FOR_OTP/bin:$PATH make check c=hex -j4 -k ${{ matrix.extra }}
+
+ - name: Upload artifacts
+ if: failure()
+ uses: actions/upload-artifact@v4
+ with:
+ name: ${{ matrix.os }} OTP-${{ matrix.erlang }} ${{ matrix.suite }} ${{ matrix.extra }}
+ path: |
+ test/test_*/
+
+ packages:
+ strategy:
+ fail-fast: false
+ matrix:
+ erlang:
+ - '27'
+ os:
+# - macos-latest
+ - ubuntu-latest
+# - windows-latest
+ extra: ['', 'LEGACY=1']
+ runs-on: ${{ matrix.os }}
+ steps:
+
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Install Erlang/OTP
+ uses: erlef/setup-beam@v1
+ with:
+ otp-version: ${{ matrix.erlang }}
+ version-type: loose
+
+ - name: Setup MSYS2 (Windows)
+ if: matrix.os == 'windows-latest'
+ uses: msys2/setup-msys2@v2
+ with:
+ msystem: mingw64
+ release: false
+ update: true
+ install: >-
+ git
+ make
+ mingw-w64-x86_64-gcc
+ gnu-netcat
+ diffutils
+
+ - name: Check packages (Linux)
+ if: matrix.os == 'ubuntu-latest'
+ run: make packages -k ${{ matrix.extra }}
+
+ - name: Check packages (Windows)
+ if: matrix.os == 'windows-latest'
+ shell: msys2 {0}
+ run: PATH=$INSTALL_DIR_FOR_OTP/bin:$PATH make packages -k ${{ matrix.extra }}
+
+ - name: Upload artifacts
+ if: failure()
+ uses: actions/upload-artifact@v4
+ with:
+ name: ${{ matrix.os }} OTP-${{ matrix.erlang }} packages ${{ matrix.extra }}
+ path: |
+ test/packages/
+
+ hexpm-packages:
+ strategy:
+ fail-fast: false
+ matrix:
+ erlang:
+ - '27'
+ os:
+# - macos-latest
+ - ubuntu-latest
+# - windows-latest
+ packages:
+ - '^cowboy \|^cowlib \|^gun \|^ranch '
+ - '^amqp_client \|^amqp10_client \|^aten \|^credentials_obfuscation \|^cuttlefish '
+ - '^gen_batch_server \|^ra \|^seshat \|^stdout_formatter \|^sysmon_handler '
+ extra: ['', 'LEGACY=1']
+ runs-on: ${{ matrix.os }}
+ steps:
+
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Install Erlang/OTP
+ uses: erlef/setup-beam@v1
+ with:
+ otp-version: ${{ matrix.erlang }}
+ version-type: loose
+
+ - name: Setup MSYS2 (Windows)
+ if: matrix.os == 'windows-latest'
+ uses: msys2/setup-msys2@v2
+ with:
+ msystem: mingw64
+ release: false
+ update: true
+ install: >-
+ git
+ make
+ mingw-w64-x86_64-gcc
+ gnu-netcat
+ diffutils
+
+ - name: Check select packages (Linux)
+ if: matrix.os == 'ubuntu-latest'
+ run: |
+ cat test/hexpm_packages.txt | grep "${{ matrix.packages }}" > select_hexpm_packages.txt
+ mv select_hexpm_packages.txt test/hexpm_packages.txt
+ make hexpm-packages -k ${{ matrix.extra }}
+
+ - name: Check select packages (Windows)
+ if: matrix.os == 'windows-latest'
+ shell: msys2 {0}
+ run: |
+ cat test/hexpm_packages.txt | grep "${{ matrix.packages }}" > select_hexpm_packages.txt
+ mv select_hexpm_packages.txt test/hexpm_packages.txt
+ PATH=$INSTALL_DIR_FOR_OTP/bin:$PATH make hexpm-packages -k ${{ matrix.extra }}
+
+ - name: Upload artifacts
+ if: failure()
+ uses: actions/upload-artifact@v4
+ with:
+ name: ${{ matrix.os }} OTP-${{ matrix.erlang }} packages ${{ matrix.extra }}
+ path: |
+ test/hexpm_packages.txt
+ test/packages/
+
+ templates:
+ strategy:
+ fail-fast: false
+ matrix:
+ erlang:
+ - '27'
+ runs-on: ubuntu-latest
+ steps:
+
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Install Erlang/OTP
+ uses: erlef/setup-beam@v1
+ with:
+ otp-version: ${{ matrix.erlang }}
+ version-type: loose
+
+ - name: Check templates
+ run: make check-templates
diff --git a/.gitignore b/.gitignore
index c1573e7..206aa1f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,7 @@
doc/guide.pdf
doc/html
+templates.mk
test/logs/
test/packages/
+test/test_hex_core_git/
+test/test_rebar_git/
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index f237592..c12cbe6 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -1,29 +1,74 @@
-2018/12/03: Relx has been updated to v3.27.0.
-
-2018/12/03: Dependencies are no longer always rebuilt by
- default. Please check the documentation for
- information. A quick fix if this causes an
- issue is to add `FULL = 1` at the top of your
- Makefile.
-
-2018/12/06: Change the default COVER_DATA_DIR to be the
- same as COVER_REPORT_DIR.
-
-2019/06/20: `list-deps` now includes local applications
- found in the `APPS_DIR` directory.
-
-2020/03/25: The `-lerl_interface` argument has been removed
- from the default `LDLIBS`. This is an old library
- that is getting removed in OTP-23 and should no
- longer be used. Note that the default still includes
- `-lei` which is part of the Erlang/OTP Erl_Interface
- *application* but is built as a separate C library.
- The removal only applies to `-lerl_interface` itself.
-
-2020/06/18: Concuerror integration has been added. It is
- currently minimal but usable. Experimentation
- and feedback is welcome.
-
-2020/11/30: Support for publishing Hex releases and docs
- has been added. It is currently experimental.
- Feedback is more than welcome.
+2023/05/12: Rebar3 is now used for autopatch instead of
+ Rebar2. `make distclean` or `rm -rf .erlang.mk`
+ might be required after updating Erlang.mk.
+ Moving to Rebar3 increases compatibility now
+ that few maintained projects are using Rebar2.
+ For compatibility reasons the variables to
+ point to a different rebar are now REBAR3_GIT
+ and REBAR3_COMMIT.
+
+2023/05/12: A number of broken packages have been removed.
+ They were all unmaintained and there's a low
+ chance that this will break anyone's project.
+
+2023/05/15: Protobuff compilation with `gpb` now uses the
+ `{use_packages, true}` option.
+
+2023/05/15: Experimental support for caching git and
+ hex dependencies has been added. Set
+ `CACHE_DEPS=1` to enable.
+
+2023/05/16: Remove support for HiPE and ErlLLVM.
+
+2024/10/01: Initial beam-cache implementation. This is used
+ to cache beam files when switching from/to test
+ builds.
+
+2024/11/14: Most packages in the Erlang.mk package index
+ have been removed. To ensure that existing
+ projects continue working, please add the
+ relevant dep_* lines to your projects. If
+ you were using dep_*_commit lines make sure
+ to update them as well. Note that projects
+ that have corresponding Erlang.mk functionality,
+ as well as Cowboy, Ranch, Gun and Cowlib remain
+ in the index.
+
+2024/11/19: The deprecated defines `dep_fetch`,
+ `dep_repo` and `dep_commit` have been removed
+ in favor of their `query_*` equivalents.
++
+ The deprecated define `dep_name` will be
+ removed at a later date to give time to
+ users to upgrade.
++
+ The deprecated legacy fetch method has also
+ been removed (`dep_cowboy = https://... ref`
+ without an explicit fetch method). Adding "git"
+ at the beginning of the dep line is the modern
+ equivalent.
+
+2024/11/22: Templates no longer use Make variables for
+ substitution. Instead the strings template_name
+ and project_name get replaced by their equivalent.
+ Note that using variables in your own templates
+ should still work, but that this way of doing
+ things is deprecated. This change makes it
+ possible to have templates outside of Makefiles.
+
+2024/11/27: $(ERL) has been updated. It no longer starts
+ the distribution, and limits processes/ports to 1024.
+
+2024/11/28: Autopatching of dependencies that are using
+ Rebar2 is deprecated and will be removed in a
+ future update. Erlang.mk will always assume
+ that a Rebar project uses Rebar3 from that
+ point forward.
+
+2025/03/18: Native support for Elixir was added. Erlang.mk
+ will now properly handle most Elixir dependencies,
+ as well as compile Elixir code in Erlang.mk projects,
+ from both src/ and lib/ directories. This allows
+ mixing Erlang and Elixir in the same project.
+ Please refer to the user guide for more information.
+ Native Elixir support is considered experimental.
diff --git a/Makefile b/Makefile
index b6b245c..ec2f746 100644
--- a/Makefile
+++ b/Makefile
@@ -29,7 +29,7 @@ ERLANG_MK_VERSION = $(shell git describe --dirty --tags --always)
.PHONY: all check
-all:
+all: templates.mk
# Temporarily force the printing of the CHANGELOG.
# The required variable hadn't been introduced yet.
#ifdef UPGRADE
@@ -40,6 +40,15 @@ all:
| sed 's/^ERLANG_MK_VERSION =.*/ERLANG_MK_VERSION = $(ERLANG_MK_VERSION)/' \
| sed 's:^ERLANG_MK_WITHOUT =.*:ERLANG_MK_WITHOUT = $(WITHOUT):' > $(ERLANG_MK)
+# Templates that end with .erl have the suffix removed. It is implied.
+templates.mk: Makefile templates/*
+ for f in templates/*; do \
+ echo define tpl_`basename $$f .erl`; \
+ cat $$f; \
+ echo endef; \
+ echo; \
+ done > $@
+
lint: all
$(MAKE) -f erlang.mk --warn-undefined-variables
@@ -50,6 +59,10 @@ MAKEOVERRIDES := $(filter-out p=$p,$(MAKEOVERRIDES))
check:
$(MAKE) -C test pkg-$p KEEP_BUILDS=1
else
+ifdef hp
+check:
+ $(MAKE) -C test hexpm-pkg-$(hp) KEEP_BUILDS=1 HEXPM=1
+else
ifdef c
check:
$(MAKE) -C test $c c=
@@ -58,10 +71,14 @@ check:
$(MAKE) -C test
endif
endif
+endif
packages:
$(MAKE) -C test packages
+hexpm-packages:
+ $(MAKE) -C test hexpm-packages HEXPM=1
+
summary:
@mkdir -p test/logs/
@touch test/logs/latest.log test/packages/errors.log
@@ -69,6 +86,9 @@ summary:
@sort test/packages/errors.log > test/logs/latest.log
@cp test/logs/latest.log "test/logs/$(shell date '+%F_%T%z')"
+check-templates:
+ $(MAKE) -C test templates
+
search:
@$(MAKE) --no-print-directory \
-f core/core.mk $(addprefix -f,$(wildcard index/*.mk)) -f core/index.mk \
diff --git a/README.asciidoc b/README.asciidoc
index 78a95a3..0b229e2 100644
--- a/README.asciidoc
+++ b/README.asciidoc
@@ -17,3 +17,5 @@ http://erlang.mk/guide/getting_started.html[Get started]
Tested and supported on
http://erlang.mk/guide/installation.html#_on_unix[Linux, FreeBSD, OSX]
and http://erlang.mk/guide/installation.html#_on_windows[Windows].
+
+Get help! https://discord.gg/x25nNq2fFE[Discord server].
diff --git a/README.legacy.md b/README.legacy.md
index 38b90e3..2c0f097 100644
--- a/README.legacy.md
+++ b/README.legacy.md
@@ -20,16 +20,3 @@ will be compiled into `a_b_templatename_dtl.beam`.
Additional ErlyDTL options can be specified as a comma-separated list
by defining the `DTL_OPTS` variable. Those options will be prepended
to the options specified by the plugin itself.
-
-Xref plugin
-------------
-
-This plugin is available by default. It adds the following
-target:
-
-`xref` Erlang Xref Runner (inspired in rebar's rebar_xref)
-
-The `XREF_CONFIG` variable specifies the location of the
-configuration file which holds the checks to be applied.
-If there is no `xref.config` all `xref` checks will be
-applied to the binaries located in the `/ebin` directory.
diff --git a/build.config b/build.config
index b363ef0..27b3dc9 100644
--- a/build.config
+++ b/build.config
@@ -6,17 +6,24 @@
# Core modules.
core/core
core/kerl
+
+# Index and dependencies.
index/*
core/index
core/deps
# Core modules, continued.
+core/beam-cache
core/erlc
+core/elixir
core/docs
core/rel
core/test
core/compat
+# Built-in templates.
+templates
+
# Plugins.
plugins/asciidoc
plugins/bootstrap
diff --git a/core/beam-cache.mk b/core/beam-cache.mk
new file mode 100644
index 0000000..d0f1d3c
--- /dev/null
+++ b/core/beam-cache.mk
@@ -0,0 +1,42 @@
+# Copyright (c) 2024, Loïc Hoguin <[email protected]>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: beam-cache-restore-app beam-cache-restore-test clean-beam-cache distclean-beam-cache
+
+BEAM_CACHE_DIR ?= $(ERLANG_MK_TMP)/beam-cache
+PROJECT_BEAM_CACHE_DIR = $(BEAM_CACHE_DIR)/$(PROJECT)
+
+clean:: clean-beam-cache
+
+clean-beam-cache:
+ $(verbose) rm -rf $(PROJECT_BEAM_CACHE_DIR)
+
+distclean:: distclean-beam-cache
+
+$(PROJECT_BEAM_CACHE_DIR):
+ $(verbose) mkdir -p $(PROJECT_BEAM_CACHE_DIR)
+
+distclean-beam-cache:
+ $(gen_verbose) rm -rf $(BEAM_CACHE_DIR)
+
+beam-cache-restore-app: | $(PROJECT_BEAM_CACHE_DIR)
+ $(verbose) rm -rf $(PROJECT_BEAM_CACHE_DIR)/ebin-test
+ifneq ($(wildcard ebin/),)
+ $(verbose) mv ebin/ $(PROJECT_BEAM_CACHE_DIR)/ebin-test
+endif
+ifneq ($(wildcard $(PROJECT_BEAM_CACHE_DIR)/ebin-app),)
+ $(gen_verbose) mv $(PROJECT_BEAM_CACHE_DIR)/ebin-app ebin/
+else
+ $(verbose) $(MAKE) --no-print-directory clean-app
+endif
+
+beam-cache-restore-test: | $(PROJECT_BEAM_CACHE_DIR)
+ $(verbose) rm -rf $(PROJECT_BEAM_CACHE_DIR)/ebin-app
+ifneq ($(wildcard ebin/),)
+ $(verbose) mv ebin/ $(PROJECT_BEAM_CACHE_DIR)/ebin-app
+endif
+ifneq ($(wildcard $(PROJECT_BEAM_CACHE_DIR)/ebin-test),)
+ $(gen_verbose) mv $(PROJECT_BEAM_CACHE_DIR)/ebin-test ebin/
+else
+ $(verbose) $(MAKE) --no-print-directory clean-app
+endif
diff --git a/core/compat.mk b/core/compat.mk
index 906faac..f9dcfe7 100644
--- a/core/compat.mk
+++ b/core/compat.mk
@@ -3,6 +3,8 @@
.PHONY: rebar.config
+compat_ref = {$(shell (git -C $(DEPS_DIR)/$1 show-ref -q --verify "refs/heads/$2" && echo branch) || (git -C $(DEPS_DIR)/$1 show-ref -q --verify "refs/tags/$2" && echo tag) || echo ref),"$2"}
+
# We strip out -Werror because we don't want to fail due to
# warnings when used as a dependency.
@@ -21,12 +23,12 @@ endef
define compat_rebar_config
{deps, [
$(call comma_list,$(foreach d,$(DEPS),\
- $(if $(filter hex,$(call dep_fetch,$d)),\
- {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
- {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+ $(if $(filter hex,$(call query_fetch_method,$d)),\
+ {$(call query_name,$d)$(comma)"$(call query_version_hex,$d)"},\
+ {$(call query_name,$d)$(comma)".*"$(comma){git,"$(call query_repo,$d)"$(comma)$(call compat_ref,$(call query_name,$d),$(call query_version,$d))}})))
]}.
{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
endef
-rebar.config:
+rebar.config: deps
$(gen_verbose) $(call core_render,compat_rebar_config,rebar.config)
diff --git a/core/core.mk b/core/core.mk
index 77adc2e..222faeb 100644
--- a/core/core.mk
+++ b/core/core.mk
@@ -36,7 +36,7 @@ PROJECT ?= $(notdir $(CURDIR))
PROJECT := $(strip $(PROJECT))
PROJECT_VERSION ?= rolling
-PROJECT_MOD ?= $(PROJECT)_app
+PROJECT_MOD ?=
PROJECT_ENV ?= []
# Verbosity.
@@ -47,7 +47,7 @@ verbose_0 = @
verbose_2 = set -x;
verbose = $(verbose_$(V))
-ifeq ($(V),3)
+ifeq ($V,3)
SHELL := $(SHELL) -x
endif
@@ -66,7 +66,7 @@ export ERLANG_MK_TMP
# "erl" command.
-ERL = erl +A1 -noinput -boot no_dot_erlang
+ERL = erl -noinput -boot no_dot_erlang -kernel start_distribution false +P 1024 +Q 1024
# Platform detection.
@@ -162,7 +162,7 @@ define newline
endef
define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
+$(subst $(space),$(comma),$(strip $1))
endef
define escape_dquotes
@@ -171,7 +171,7 @@ endef
# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
define erlang
-$(ERL) $2 -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(call escape_dquotes,$1))" -- erlang.mk
+$(ERL) $2 -pz $(ERLANG_MK_TMP)/rebar3/_build/prod/lib/*/ebin/ -eval "$(subst $(newline),,$(call escape_dquotes,$1))" -- erlang.mk
endef
ifeq ($(PLATFORM),msys2)
@@ -180,22 +180,23 @@ else
core_native_path = $1
endif
-core_http_get = curl -Lf$(if $(filter-out 0,$(V)),,s)o $(call core_native_path,$1) $2
+core_http_get = curl -Lf$(if $(filter-out 0,$V),,s)o $(call core_native_path,$1) $2
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+core_eq = $(and $(findstring $1,$2),$(findstring $2,$1))
# We skip files that contain spaces because they end up causing issues.
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) \( -type l -o -type f \) -name $(subst *,\*,$2) | grep -v " "))
+# Files that begin with a dot are already ignored by the wildcard function.
+core_find = $(foreach f,$(wildcard $(1:%/=%)/*),$(if $(wildcard $f/.),$(call core_find,$f,$2),$(if $(filter $(subst *,%,$2),$f),$(if $(wildcard $f),$f))))
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))
-core_ls = $(filter-out $(1),$(shell echo $(1)))
+core_ls = $(filter-out $1,$(shell echo $1))
# @todo Use a solution that does not require using perl.
core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
define core_render
- printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+ printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $1)))))\n' > $2
endef
# Automated update.
diff --git a/core/deps-tools.mk b/core/deps-tools.mk
index 262d045..b29bf2a 100644
--- a/core/deps-tools.mk
+++ b/core/deps-tools.mk
@@ -78,9 +78,7 @@ endif
ifeq ($(IS_APP)$(IS_DEP),)
$(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | \
uniq > $(ERLANG_MK_RECURSIVE_TMP_LIST).sorted
- $(verbose) cmp -s $(ERLANG_MK_RECURSIVE_TMP_LIST).sorted $@ \
- || mv $(ERLANG_MK_RECURSIVE_TMP_LIST).sorted $@
- $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST).sorted
+ $(verbose) mv $(ERLANG_MK_RECURSIVE_TMP_LIST).sorted $@
$(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
endif
endif # ifneq ($(SKIP_DEPS),)
@@ -107,14 +105,14 @@ list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
QUERY ?= name fetch_method repo version
define query_target
-$(1): $(2) clean-tmp-query.log
+$1: $2 clean-tmp-query.log
ifeq ($(IS_APP)$(IS_DEP),)
- $(verbose) rm -f $(4)
+ $(verbose) rm -f $4
endif
- $(verbose) $(foreach dep,$(3),\
- echo $(PROJECT): $(foreach q,$(QUERY),$(call query_$(q),$(dep))) >> $(4) ;)
- $(if $(filter-out query-deps,$(1)),,\
- $(verbose) set -e; for dep in $(3) ; do \
+ $(verbose) $(foreach dep,$3,\
+ echo $(PROJECT): $(foreach q,$(QUERY),$(call query_$(q),$(dep))) >> $4 ;)
+ $(if $(filter-out query-deps,$1),,\
+ $(verbose) set -e; for dep in $3 ; do \
if grep -qs ^$$$$dep$$$$ $(ERLANG_MK_TMP)/query.log; then \
:; \
else \
@@ -123,8 +121,8 @@ endif
fi \
done)
ifeq ($(IS_APP)$(IS_DEP),)
- $(verbose) touch $(4)
- $(verbose) cat $(4)
+ $(verbose) touch $4
+ $(verbose) cat $4
endif
endef
diff --git a/core/deps.mk b/core/deps.mk
index 6d6623b..da7f7c4 100644
--- a/core/deps.mk
+++ b/core/deps.mk
@@ -21,19 +21,35 @@ export DEPS_DIR
REBAR_DEPS_DIR = $(DEPS_DIR)
export REBAR_DEPS_DIR
-REBAR_GIT ?= https://github.com/rebar/rebar
-REBAR_COMMIT ?= 576e12171ab8d69b048b827b92aa65d067deea01
+# When testing Erlang.mk and updating these, make sure
+# to delete test/test_rebar_git before running tests again.
+REBAR3_GIT ?= https://github.com/erlang/rebar3
+REBAR3_COMMIT ?= bde4b54248d16280b2c70a244aca3bb7566e2033 # 3.23.0
+
+CACHE_DEPS ?= 0
+
+CACHE_DIR ?= $(if $(XDG_CACHE_HOME),$(XDG_CACHE_HOME),$(HOME)/.cache)/erlang.mk
+export CACHE_DIR
+
+HEX_CONFIG ?=
+
+define hex_config.erl
+ begin
+ Config0 = hex_core:default_config(),
+ Config0$(HEX_CONFIG)
+ end
+endef
# External "early" plugins (see core/plugins.mk for regular plugins).
# They both use the core_dep_plugin macro.
define core_dep_plugin
-ifeq ($(2),$(PROJECT))
--include $$(patsubst $(PROJECT)/%,%,$(1))
+ifeq ($2,$(PROJECT))
+-include $$(patsubst $(PROJECT)/%,%,$1)
else
--include $(DEPS_DIR)/$(1)
+-include $(DEPS_DIR)/$1
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+$(DEPS_DIR)/$1: $(DEPS_DIR)/$2 ;
endif
endef
@@ -46,44 +62,42 @@ $(foreach p,$(DEP_EARLY_PLUGINS),\
# Query functions.
-query_fetch_method = $(if $(dep_$(1)),$(call _qfm_dep,$(word 1,$(dep_$(1)))),$(call _qfm_pkg,$(1)))
-_qfm_dep = $(if $(dep_fetch_$(1)),$(1),$(if $(IS_DEP),legacy,fail))
+query_fetch_method = $(if $(dep_$(1)),$(call _qfm_dep,$(word 1,$(dep_$(1)))),$(call _qfm_pkg,$1))
+_qfm_dep = $(if $(dep_fetch_$(1)),$1,fail)
_qfm_pkg = $(if $(pkg_$(1)_fetch),$(pkg_$(1)_fetch),fail)
-query_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+query_name = $(if $(dep_$(1)),$1,$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$1))
-query_repo = $(call _qr,$(1),$(call query_fetch_method,$(1)))
-_qr = $(if $(query_repo_$(2)),$(call query_repo_$(2),$(1)),$(call dep_repo,$(1)))
+query_repo = $(call _qr,$1,$(call query_fetch_method,$1))
+_qr = $(if $(query_repo_$(2)),$(call query_repo_$(2),$1),$(call query_repo_git,$1))
query_repo_default = $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo))
-query_repo_git = $(patsubst git://github.com/%,https://github.com/%,$(call query_repo_default,$(1)))
-query_repo_git-subfolder = $(call query_repo_git,$(1))
+query_repo_git = $(patsubst git://github.com/%,https://github.com/%,$(call query_repo_default,$1))
+query_repo_git-subfolder = $(call query_repo_git,$1)
query_repo_git-submodule = -
-query_repo_hg = $(call query_repo_default,$(1))
-query_repo_svn = $(call query_repo_default,$(1))
-query_repo_cp = $(call query_repo_default,$(1))
-query_repo_ln = $(call query_repo_default,$(1))
-query_repo_hex = https://hex.pm/packages/$(if $(word 3,$(dep_$(1))),$(word 3,$(dep_$(1))),$(1))
+query_repo_hg = $(call query_repo_default,$1)
+query_repo_svn = $(call query_repo_default,$1)
+query_repo_cp = $(call query_repo_default,$1)
+query_repo_ln = $(call query_repo_default,$1)
+query_repo_hex = https://hex.pm/packages/$(if $(word 3,$(dep_$(1))),$(word 3,$(dep_$(1))),$1)
query_repo_fail = -
-query_repo_legacy = -
-query_version = $(call _qv,$(1),$(call query_fetch_method,$(1)))
-_qv = $(if $(query_version_$(2)),$(call query_version_$(2),$(1)),$(call dep_commit,$(1)))
+query_version = $(call _qv,$1,$(call query_fetch_method,$1))
+_qv = $(if $(query_version_$(2)),$(call query_version_$(2),$1),$(call query_version_default,$1))
query_version_default = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-query_version_git = $(call query_version_default,$(1))
-query_version_git-subfolder = $(call query_version_git,$(1))
+query_version_git = $(call query_version_default,$1)
+query_version_git-subfolder = $(call query_version_default,$1)
query_version_git-submodule = -
-query_version_hg = $(call query_version_default,$(1))
+query_version_hg = $(call query_version_default,$1)
query_version_svn = -
query_version_cp = -
query_version_ln = -
query_version_hex = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_commit)))
query_version_fail = -
-query_version_legacy = -
-query_extra = $(call _qe,$(1),$(call query_fetch_method,$(1)))
-_qe = $(if $(query_extra_$(2)),$(call query_extra_$(2),$(1)),-)
+query_extra = $(call _qe,$1,$(call query_fetch_method,$1))
+_qe = $(if $(query_extra_$(2)),$(call query_extra_$(2),$1),-)
query_extra_git = -
query_extra_git-subfolder = $(if $(dep_$(1)),subfolder=$(word 4,$(dep_$(1))),-)
@@ -94,18 +108,19 @@ query_extra_cp = -
query_extra_ln = -
query_extra_hex = $(if $(dep_$(1)),package-name=$(word 3,$(dep_$(1))),-)
query_extra_fail = -
-query_extra_legacy = -
-query_absolute_path = $(addprefix $(DEPS_DIR)/,$(call query_name,$(1)))
+query_absolute_path = $(addprefix $(DEPS_DIR)/,$(call query_name,$1))
-# Deprecated legacy query functions.
-dep_fetch = $(call query_fetch_method,$(1))
+# Deprecated legacy query function. Used by RabbitMQ and its third party plugins.
+# Can be removed once RabbitMQ has been updated and enough time has passed.
dep_name = $(call query_name,$(1))
-dep_repo = $(call query_repo_git,$(1))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(if $(filter hex,$(word 1,$(dep_$(1)))),$(word 2,$(dep_$(1))),$(word 3,$(dep_$(1)))),$(pkg_$(1)_commit)))
-LOCAL_DEPS_DIRS = $(foreach a,$(LOCAL_DEPS),$(if $(wildcard $(APPS_DIR)/$(a)),$(APPS_DIR)/$(a)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+# Application directories.
+
+LOCAL_DEPS_DIRS = $(foreach a,$(LOCAL_DEPS),$(if $(wildcard $(APPS_DIR)/$a),$(APPS_DIR)/$a))
+# Elixir is handled specially as it must be built before all other deps
+# when Mix autopatching is necessary.
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call query_name,$(dep))))
# When we are calling an app directly we don't want to include it here
# otherwise it'll be treated both as an apps and a top-level project.
@@ -127,9 +142,17 @@ export ERL_LIBS
export NO_AUTOPATCH
+# Elixir.
+
+# Elixir is automatically enabled in all cases except when
+# an Erlang project uses an Elixir dependency. In that case
+# $(ELIXIR) must be set explicitly.
+ELIXIR ?= $(if $(filter elixir,$(BUILD_DEPS) $(DEPS)),dep,$(if $(EX_FILES),system,disable))
+export ELIXIR
+
# Verbosity.
-dep_verbose_0 = @echo " DEP $1 ($(call dep_commit,$1))";
+dep_verbose_0 = @echo " DEP $1 ($(call query_version,$1))";
dep_verbose_2 = set -x;
dep_verbose = $(dep_verbose_$(V))
@@ -197,15 +220,20 @@ endif
ifneq ($(SKIP_DEPS),)
deps::
else
-deps:: $(ALL_DEPS_DIRS) apps clean-tmp-deps.log | $(ERLANG_MK_TMP)
-ifneq ($(ALL_DEPS_DIRS),)
- $(verbose) set -e; for dep in $(ALL_DEPS_DIRS); do \
+ALL_DEPS_DIRS_TO_BUILD = $(if $(filter-out $(DEPS_DIR)/elixir,$(ALL_DEPS_DIRS)),$(filter-out $(DEPS_DIR)/elixir,$(ALL_DEPS_DIRS)),$(ALL_DEPS_DIRS))
+
+deps:: $(ALL_DEPS_DIRS_TO_BUILD) apps clean-tmp-deps.log | $(ERLANG_MK_TMP)
+ifneq ($(ALL_DEPS_DIRS_TO_BUILD),)
+ $(verbose) set -e; for dep in $(ALL_DEPS_DIRS_TO_BUILD); do \
if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
:; \
else \
echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
if [ -z "$(strip $(FULL))" ] $(if $(force_rebuild_dep),&& ! ($(call force_rebuild_dep,$$dep)),) && [ ! -L $$dep ] && [ -f $$dep/ebin/dep_built ]; then \
:; \
+ elif [ "$$dep" = "$(DEPS_DIR)/hut" -a "$(HUT_PATCH)" ]; then \
+ $(MAKE) -C $$dep app IS_DEP=1; \
+ if [ ! -L $$dep ] && [ -d $$dep/ebin ]; then touch $$dep/ebin/dep_built; fi; \
elif [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
$(MAKE) -C $$dep IS_DEP=1; \
if [ ! -L $$dep ] && [ -d $$dep/ebin ]; then touch $$dep/ebin/dep_built; fi; \
@@ -220,51 +248,80 @@ endif
# Deps related targets.
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
- if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
- rm -rf $(DEPS_DIR)/$1/ebin/; \
- $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
- $(call dep_autopatch_erlang_mk,$(1)); \
- elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
- if [ -f $(DEPS_DIR)/$1/rebar.lock ]; then \
- $(call dep_autopatch2,$1); \
- elif [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
- $(call dep_autopatch2,$(1)); \
- elif [ 0 != `grep -ci "^[^#].*rebar" $(DEPS_DIR)/$(1)/Makefile` ]; then \
- $(call dep_autopatch2,$(1)); \
- elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i "^[^#].*rebar" '{}' \;`" ]; then \
- $(call dep_autopatch2,$(1)); \
+autopatch_verbose_0 = @echo " PATCH " $(subst autopatch-,,$@) "(method: $(AUTOPATCH_METHOD))";
+autopatch_verbose_2 = set -x;
+autopatch_verbose = $(autopatch_verbose_$(V))
+
+define dep_autopatch_detect
+ if [ -f $(DEPS_DIR)/$1/erlang.mk ]; then \
+ echo erlang.mk; \
+ elif [ -f $(DEPS_DIR)/$1/mix.exs -a -d $(DEPS_DIR)/$1/lib ]; then \
+ if [ "$(ELIXIR)" != "disable" ]; then \
+ echo mix; \
+ elif [ -f $(DEPS_DIR)/$1/rebar.lock -o -f $(DEPS_DIR)/$1/rebar.config ]; then \
+ echo rebar3; \
+ elif [ -f $(DEPS_DIR)/$1/Makefile ]; then \
+ echo noop; \
+ else \
+ exit 99; \
fi \
- else \
- if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
- $(call dep_autopatch_noop,$(1)); \
+ elif [ -f $(DEPS_DIR)/$1/Makefile ]; then \
+ if [ -f $(DEPS_DIR)/$1/rebar.lock ]; then \
+ echo rebar3; \
+ elif [ 0 != \`grep -c "include ../\w*\.mk" $(DEPS_DIR)/$1/Makefile\` ]; then \
+ echo rebar3; \
+ elif [ 0 != \`grep -ci "^[^#].*rebar" $(DEPS_DIR)/$1/Makefile\` ]; then \
+ echo rebar3; \
+ elif [ -n "\`find $(DEPS_DIR)/$1/ -type f -name \*.mk -not -name erlang.mk -exec grep -i "^[^#].*rebar" '{}' \;\`" ]; then \
+ echo rebar3; \
else \
- $(call dep_autopatch2,$(1)); \
+ echo noop; \
fi \
+ elif [ ! -d $(DEPS_DIR)/$1/src/ ]; then \
+ echo noop; \
+ else \
+ echo rebar3; \
fi
endef
-define dep_autopatch2
+define dep_autopatch_for_erlang.mk
+ rm -rf $(DEPS_DIR)/$1/ebin/; \
+ $(call erlang,$(call dep_autopatch_appsrc.erl,$1)); \
+ $(call dep_autopatch_erlang_mk,$1)
+endef
+
+define dep_autopatch_for_rebar3
! test -f $(DEPS_DIR)/$1/ebin/$1.app || \
mv -n $(DEPS_DIR)/$1/ebin/$1.app $(DEPS_DIR)/$1/src/$1.app.src; \
rm -f $(DEPS_DIR)/$1/ebin/$1.app; \
if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
- $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+ $(call erlang,$(call dep_autopatch_appsrc_script.erl,$1)); \
fi; \
- $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
- if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script -o -f $(DEPS_DIR)/$1/rebar.lock ]; then \
+ $(call erlang,$(call dep_autopatch_appsrc.erl,$1)); \
+ if [ -f $(DEPS_DIR)/$1/rebar -o -f $(DEPS_DIR)/$1/rebar.config -o -f $(DEPS_DIR)/$1/rebar.config.script -o -f $(DEPS_DIR)/$1/rebar.lock ]; then \
$(call dep_autopatch_fetch_rebar); \
- $(call dep_autopatch_rebar,$(1)); \
+ $(call dep_autopatch_rebar,$1); \
else \
- $(call dep_autopatch_gen,$(1)); \
+ $(call dep_autopatch_gen,$1); \
fi
endef
-define dep_autopatch_noop
- printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+define dep_autopatch_for_mix
+ $(call dep_autopatch_mix,$1)
+endef
+
+define dep_autopatch_for_noop
+ test -f $(DEPS_DIR)/$1/Makefile || printf "noop:\n" > $(DEPS_DIR)/$1/Makefile
+endef
+
+define maybe_flock
+ if command -v flock >/dev/null; then \
+ flock $1 sh -c "$2"; \
+ elif command -v lockf >/dev/null; then \
+ lockf $1 sh -c "$2"; \
+ else \
+ $2; \
+ fi
endef
# Replace "include erlang.mk" with a line that will load the parent Erlang.mk
@@ -286,42 +343,36 @@ endif
define dep_autopatch_gen
printf "%s\n" \
"ERLC_OPTS = +debug_info" \
- "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+ "include ../../erlang.mk" > $(DEPS_DIR)/$1/Makefile
endef
# We use flock/lockf when available to avoid concurrency issues.
define dep_autopatch_fetch_rebar
- if command -v flock >/dev/null; then \
- flock $(ERLANG_MK_TMP)/rebar.lock sh -c "$(call dep_autopatch_fetch_rebar2)"; \
- elif command -v lockf >/dev/null; then \
- lockf $(ERLANG_MK_TMP)/rebar.lock sh -c "$(call dep_autopatch_fetch_rebar2)"; \
- else \
- $(call dep_autopatch_fetch_rebar2); \
- fi
+ $(call maybe_flock,$(ERLANG_MK_TMP)/rebar.lock,$(call dep_autopatch_fetch_rebar2))
endef
define dep_autopatch_fetch_rebar2
- if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
- git clone -q -n -- $(REBAR_GIT) $(ERLANG_MK_TMP)/rebar; \
- cd $(ERLANG_MK_TMP)/rebar; \
- git checkout -q $(REBAR_COMMIT); \
+ if [ ! -d $(ERLANG_MK_TMP)/rebar3 ]; then \
+ git clone -q -n -- $(REBAR3_GIT) $(ERLANG_MK_TMP)/rebar3; \
+ cd $(ERLANG_MK_TMP)/rebar3; \
+ git checkout -q $(REBAR3_COMMIT); \
./bootstrap; \
cd -; \
fi
endef
define dep_autopatch_rebar
- if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
- mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+ if [ -f $(DEPS_DIR)/$1/Makefile ]; then \
+ mv $(DEPS_DIR)/$1/Makefile $(DEPS_DIR)/$1/Makefile.orig.mk; \
fi; \
- $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
- rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+ $(call erlang,$(call dep_autopatch_rebar.erl,$1)); \
+ rm -f $(DEPS_DIR)/$1/ebin/$1.app
endef
define dep_autopatch_rebar.erl
application:load(rebar),
application:set_env(rebar, log_level, debug),
- rmemo:start(),
+ {module, rebar3} = c:l(rebar3),
Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
{ok, Conf0} -> Conf0;
_ -> []
@@ -355,7 +406,7 @@ define dep_autopatch_rebar.erl
(V) when is_list(V) -> "'\\"" ++ V ++ "\\"'"
end,
fun() ->
- Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+ Write("ERLC_OPTS = +debug_info\n"),
case lists:keyfind(erl_opts, 1, Conf) of
false -> ok;
{_, ErlOpts} ->
@@ -378,78 +429,105 @@ define dep_autopatch_rebar.erl
end,
Write("\n")
end(),
- GetHexVsn = fun(N, NP) ->
+ GetHexVsn2 = fun(N, NP) ->
case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.lock)") of
{ok, Lock} ->
- io:format("~p~n", [Lock]),
- case lists:keyfind("1.1.0", 1, Lock) of
- {_, LockPkgs} ->
- io:format("~p~n", [LockPkgs]),
+ LockPkgs = case lists:keyfind("1.2.0", 1, Lock) of
+ {_, LP} ->
+ LP;
+ _ ->
+ case lists:keyfind("1.1.0", 1, Lock) of
+ {_, LP} ->
+ LP;
+ _ ->
+ false
+ end
+ end,
+ if
+ is_list(LockPkgs) ->
case lists:keyfind(atom_to_binary(N, latin1), 1, LockPkgs) of
{_, {pkg, _, Vsn}, _} ->
- io:format("~p~n", [Vsn]),
{N, {hex, NP, binary_to_list(Vsn)}};
_ ->
false
end;
- _ ->
+ true ->
false
end;
_ ->
false
end
end,
- SemVsn = fun
- ("~>" ++ S0) ->
- S = case S0 of
- " " ++ S1 -> S1;
- _ -> S0
- end,
- case length([ok || $$. <- S]) of
- 0 -> S ++ ".0.0";
- 1 -> S ++ ".0";
- _ -> S
- end;
- (S) -> S
+ GetHexVsn3Common = fun(N, NP, S0) ->
+ case GetHexVsn2(N, NP) of
+ false ->
+ S2 = case S0 of
+ " " ++ S1 -> S1;
+ _ -> S0
+ end,
+ S = case length([ok || $$. <- S2]) of
+ 0 -> S2 ++ ".0.0";
+ 1 -> S2 ++ ".0";
+ _ -> S2
+ end,
+ {N, {hex, NP, S}};
+ NameSource ->
+ NameSource
+ end
+ end,
+ GetHexVsn3 = fun
+ (N, NP, "~>" ++ S0) ->
+ GetHexVsn3Common(N, NP, S0);
+ (N, NP, ">=" ++ S0) ->
+ GetHexVsn3Common(N, NP, S0);
+ (N, NP, S) -> {N, {hex, NP, S}}
+ end,
+ ConvertCommit = fun
+ ({branch, C}) -> C;
+ ({ref, C}) -> C;
+ ({tag, C}) -> C;
+ (C) -> C
end,
fun() ->
File = case lists:keyfind(deps, 1, Conf) of
false -> [];
{_, Deps} ->
[begin case case Dep of
- N when is_atom(N) -> GetHexVsn(N, N);
- {N, S} when is_atom(N), is_list(S) -> {N, {hex, N, SemVsn(S)}};
- {N, {pkg, NP}} when is_atom(N) -> GetHexVsn(N, NP);
- {N, S, {pkg, NP}} -> {N, {hex, NP, S}};
+ N when is_atom(N) -> GetHexVsn2(N, N);
+ {N, S} when is_atom(N), is_list(S) -> GetHexVsn3(N, N, S);
+ {N, {pkg, NP}} when is_atom(N) -> GetHexVsn2(N, NP);
+ {N, S, {pkg, NP}} -> GetHexVsn3(N, NP, S);
{N, S} when is_tuple(S) -> {N, S};
{N, _, S} -> {N, S};
{N, _, S, _} -> {N, S};
_ -> false
end of
false -> ok;
+ {Name, {git_subdir, Repo, Commit, SubDir}} ->
+ Write(io_lib:format("DEPS += ~s\ndep_~s = git-subfolder ~s ~s ~s~n", [Name, Name, Repo, ConvertCommit(Commit), SubDir]));
{Name, Source} ->
{Method, Repo, Commit} = case Source of
{hex, NPV, V} -> {hex, V, NPV};
{git, R} -> {git, R, master};
- {M, R, {branch, C}} -> {M, R, C};
- {M, R, {ref, C}} -> {M, R, C};
- {M, R, {tag, C}} -> {M, R, C};
{M, R, C} -> {M, R, C}
end,
- Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+ Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, ConvertCommit(Commit)]))
end end || Dep <- Deps]
end
end(),
fun() ->
case lists:keyfind(erl_first_files, 1, Conf) of
false -> ok;
- {_, Files} ->
+ {_, Files0} ->
+ Files = [begin
+ hd(filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)**/" ++ filename:rootname(F) ++ ".*rl"))
+ end || "src/" ++ F <- Files0],
Names = [[" ", case lists:reverse(F) of
"lre." ++ Elif -> lists:reverse(Elif);
"lrx." ++ Elif -> lists:reverse(Elif);
"lry." ++ Elif -> lists:reverse(Elif);
Elif -> lists:reverse(Elif)
- end] || "src/" ++ F <- Files],
+ end] || "$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ F <- Files],
Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
end
end(),
@@ -476,6 +554,8 @@ define dep_autopatch_rebar.erl
Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
{compile, Cmd} ->
Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+ {{pc, compile}, Cmd} ->
+ Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
{Regex, compile, Cmd} ->
case rebar_utils:is_arch(Regex) of
true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
@@ -566,9 +646,11 @@ define dep_autopatch_rebar.erl
[[Output, ": ", K, " += ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
Output, ": $$\(foreach ext,.c .C .cc .cpp,",
"$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
- "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+ "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(LDLIBS) $$\(EXE_LDFLAGS)",
case {filename:extension(Output), $(PLATFORM)} of
{[], _} -> "\n";
+ {".so", darwin} -> " -shared\n";
+ {".dylib", darwin} -> " -shared\n";
{_, darwin} -> "\n";
_ -> " -shared\n"
end])
@@ -638,9 +720,12 @@ endef
define dep_autopatch_appsrc_script.erl
AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
AppSrcScript = AppSrc ++ ".script",
- {ok, Conf0} = file:consult(AppSrc),
+ Conf1 = case file:consult(AppSrc) of
+ {ok, Conf0} -> Conf0;
+ {error, enoent} -> []
+ end,
Bindings0 = erl_eval:new_bindings(),
- Bindings1 = erl_eval:add_binding('CONFIG', Conf0, Bindings0),
+ Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
Bindings = erl_eval:add_binding('SCRIPT', AppSrcScript, Bindings1),
Conf = case file:script(AppSrcScript, Bindings) of
{ok, [C]} -> C;
@@ -656,7 +741,7 @@ define dep_autopatch_appsrc.erl
case filelib:is_regular(AppSrcIn) of
false -> ok;
true ->
- {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+ {ok, [{application, $1, L0}]} = file:consult(AppSrcIn),
L1 = lists:keystore(modules, 1, L0, {modules, []}),
L2 = case lists:keyfind(vsn, 1, L1) of
{_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, lists:droplast(os:cmd("git -C $(DEPS_DIR)/$1 describe --dirty --tags --always"))});
@@ -664,116 +749,182 @@ define dep_autopatch_appsrc.erl
_ -> L1
end,
L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
- ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+ ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $1, L3}])),
case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
end,
halt()
endef
+ifeq ($(CACHE_DEPS),1)
+
+define dep_cache_fetch_git
+ mkdir -p $(CACHE_DIR)/git; \
+ if test -d "$(join $(CACHE_DIR)/git/,$(call query_name,$1))"; then \
+ cd $(join $(CACHE_DIR)/git/,$(call query_name,$1)); \
+ if ! git checkout -q $(call query_version,$1); then \
+ git remote set-url origin $(call query_repo_git,$1) && \
+ git pull --all && \
+ git cat-file -e $(call query_version_git,$1) 2>/dev/null; \
+ fi; \
+ else \
+ git clone -q -n -- $(call query_repo_git,$1) $(join $(CACHE_DIR)/git/,$(call query_name,$1)); \
+ fi; \
+ git clone -q --single-branch -- $(join $(CACHE_DIR)/git/,$(call query_name,$1)) $2; \
+ cd $2 && git checkout -q $(call query_version_git,$1)
+endef
+
+define dep_fetch_git
+ $(call dep_cache_fetch_git,$1,$(DEPS_DIR)/$(call query_name,$1));
+endef
+
+define dep_fetch_git-subfolder
+ mkdir -p $(ERLANG_MK_TMP)/git-subfolder; \
+ $(call dep_cache_fetch_git,$1,$(ERLANG_MK_TMP)/git-subfolder/$(call query_name,$1)); \
+ ln -s $(ERLANG_MK_TMP)/git-subfolder/$(call query_name,$1)/$(word 4,$(dep_$1)) \
+ $(DEPS_DIR)/$(call query_name,$1);
+endef
+
+else
+
define dep_fetch_git
- git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
- cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+ git clone -q -n -- $(call query_repo_git,$1) $(DEPS_DIR)/$(call query_name,$1); \
+ cd $(DEPS_DIR)/$(call query_name,$1) && git checkout -q $(call query_version_git,$1);
endef
define dep_fetch_git-subfolder
mkdir -p $(ERLANG_MK_TMP)/git-subfolder; \
- git clone -q -n -- $(call dep_repo,$1) \
- $(ERLANG_MK_TMP)/git-subfolder/$(call dep_name,$1); \
- cd $(ERLANG_MK_TMP)/git-subfolder/$(call dep_name,$1) \
- && git checkout -q $(call dep_commit,$1); \
- ln -s $(ERLANG_MK_TMP)/git-subfolder/$(call dep_name,$1)/$(word 4,$(dep_$(1))) \
- $(DEPS_DIR)/$(call dep_name,$1);
+ git clone -q -n -- $(call query_repo_git-subfolder,$1) \
+ $(ERLANG_MK_TMP)/git-subfolder/$(call query_name,$1); \
+ cd $(ERLANG_MK_TMP)/git-subfolder/$(call query_name,$1) \
+ && git checkout -q $(call query_version_git-subfolder,$1); \
+ ln -s $(ERLANG_MK_TMP)/git-subfolder/$(call query_name,$1)/$(word 4,$(dep_$1)) \
+ $(DEPS_DIR)/$(call query_name,$1);
endef
+endif
+
define dep_fetch_git-submodule
git submodule update --init -- $(DEPS_DIR)/$1;
endef
define dep_fetch_hg
- hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
- cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+ hg clone -q -U $(call query_repo_hg,$1) $(DEPS_DIR)/$(call query_name,$1); \
+ cd $(DEPS_DIR)/$(call query_name,$1) && hg update -q $(call query_version_hg,$1);
endef
define dep_fetch_svn
- svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+ svn checkout -q $(call query_repo_svn,$1) $(DEPS_DIR)/$(call query_name,$1);
endef
define dep_fetch_cp
- cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+ cp -R $(call query_repo_cp,$1) $(DEPS_DIR)/$(call query_name,$1);
endef
define dep_fetch_ln
- ln -s $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+ ln -s $(call query_repo_ln,$1) $(DEPS_DIR)/$(call query_name,$1);
endef
+define hex_get_tarball.erl
+ {ok, _} = application:ensure_all_started(ssl),
+ {ok, _} = application:ensure_all_started(inets),
+ Config = $(hex_config.erl),
+ case hex_repo:get_tarball(Config, <<"$1">>, <<"$(strip $2)">>) of
+ {ok, {200, _, Tarball}} ->
+ ok = file:write_file("$(call core_native_path,$3)", Tarball),
+ halt(0);
+ {ok, {Status, _, Errors}} ->
+ io:format("Error ~b: ~0p~n", [Status, Errors]),
+ halt(79)
+ end
+endef
+
+ifeq ($(CACHE_DEPS),1)
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+ mkdir -p $(CACHE_DIR)/hex $(DEPS_DIR)/$1; \
+ $(eval hex_pkg_name := $(if $(word 3,$(dep_$1)),$(word 3,$(dep_$1)),$1)) \
+ $(eval hex_tar_name := $(hex_pkg_name)-$(strip $(word 2,$(dep_$1))).tar) \
+ $(if $(wildcard $(CACHE_DIR)/hex/$(hex_tar_name)),,\
+ $(call erlang,$(call hex_get_tarball.erl,$(hex_pkg_name),$(word 2,$(dep_$1)),$(CACHE_DIR)/hex/$(hex_tar_name)));) \
+ tar -xOf $(CACHE_DIR)/hex/$(hex_tar_name) contents.tar.gz | tar -C $(DEPS_DIR)/$1 -xzf -;
+endef
+
+else
+
# Hex only has a package version. No need to look in the Erlang.mk packages.
define dep_fetch_hex
mkdir -p $(ERLANG_MK_TMP)/hex $(DEPS_DIR)/$1; \
- $(call core_http_get,$(ERLANG_MK_TMP)/hex/$1.tar,\
- https://repo.hex.pm/tarballs/$(if $(word 3,$(dep_$1)),$(word 3,$(dep_$1)),$1)-$(strip $(word 2,$(dep_$1))).tar); \
+ $(call erlang,$(call hex_get_tarball.erl,$(if $(word 3,$(dep_$1)),$(word 3,$(dep_$1)),$1),$(word 2,$(dep_$1)),$(ERLANG_MK_TMP)/hex/$1.tar)); \
tar -xOf $(ERLANG_MK_TMP)/hex/$1.tar contents.tar.gz | tar -C $(DEPS_DIR)/$1 -xzf -;
endef
+endif
+
define dep_fetch_fail
- echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+ echo "Error: Unknown or invalid dependency: $1." >&2; \
exit 78;
endef
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
- $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
- git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
- cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
define dep_target
-$(DEPS_DIR)/$(call dep_name,$1): | $(ERLANG_MK_TMP)
- $(eval DEP_NAME := $(call dep_name,$1))
+$(DEPS_DIR)/$(call query_name,$1): $(if $(filter elixir,$(BUILD_DEPS) $(DEPS)),$(if $(filter-out elixir,$1),$(DEPS_DIR)/elixir/ebin/dep_built)) $(if $(filter hex,$(call query_fetch_method,$1)),$(if $(wildcard $(DEPS_DIR)/$(call query_name,$1)),,$(DEPS_DIR)/hex_core/ebin/dep_built)) | $(ERLANG_MK_TMP)
+ $(eval DEP_NAME := $(call query_name,$1))
$(eval DEP_STR := $(if $(filter $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
$(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)." >&2; \
exit 17; \
fi
$(verbose) mkdir -p $(DEPS_DIR)
- $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
- $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
- && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+ $(dep_verbose) $(call dep_fetch_$(strip $(call query_fetch_method,$1)),$1)
+ $(verbose) if [ -f $(DEPS_DIR)/$1/configure.ac -o -f $(DEPS_DIR)/$1/configure.in ] \
+ && [ ! -f $(DEPS_DIR)/$1/configure ]; then \
echo " AUTO " $(DEP_STR); \
- cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+ cd $(DEPS_DIR)/$1 && autoreconf -Wall -vif -I m4; \
fi
- $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
echo " CONF " $(DEP_STR); \
cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
- $(verbose) $$(MAKE) --no-print-directory autopatch-$(DEP_NAME)
+ifeq ($(filter $1,$(NO_AUTOPATCH)),)
+ $(verbose) AUTOPATCH_METHOD=`$(call dep_autopatch_detect,$1)`; \
+ if [ $$$$? -eq 99 ]; then \
+ echo "Elixir is currently disabled. Please set 'ELIXIR = system' in the Makefile to enable"; \
+ exit 99; \
+ fi; \
+ $$(MAKE) --no-print-directory autopatch-$(DEP_NAME) AUTOPATCH_METHOD=$$$$AUTOPATCH_METHOD
endif
-.PHONY: autopatch-$(call dep_name,$1)
+.PHONY: autopatch-$(call query_name,$1)
-autopatch-$(call dep_name,$1)::
- $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
- if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
- echo " PATCH Downloading rabbitmq-codegen"; \
- git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
- fi; \
- if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
- echo " PATCH Downloading rabbitmq-server"; \
- git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
- fi; \
- ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
- elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
- if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
- echo " PATCH Downloading rabbitmq-codegen"; \
- git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
- fi \
- elif [ "$1" = "elixir" -a "$(ELIXIR_PATCH)" ]; then \
- ln -s lib/elixir/ebin $(DEPS_DIR)/elixir/; \
- else \
- $$(call dep_autopatch,$(call dep_name,$1)) \
- fi
+ifeq ($1,elixir)
+autopatch-elixir::
+ $$(verbose) ln -s lib/elixir/ebin $(DEPS_DIR)/elixir/
+else
+autopatch-$(call query_name,$1)::
+ $$(autopatch_verbose) $$(call dep_autopatch_for_$(AUTOPATCH_METHOD),$(call query_name,$1))
+endif
endef
+# We automatically depend on hex_core when the project isn't already.
+$(if $(filter hex_core,$(DEPS) $(BUILD_DEPS) $(DOC_DEPS) $(REL_DEPS) $(TEST_DEPS)),,\
+ $(eval $(call dep_target,hex_core)))
+
+$(DEPS_DIR)/hex_core/ebin/dep_built: | $(ERLANG_MK_TMP)
+ $(verbose) $(call maybe_flock,$(ERLANG_MK_TMP)/hex_core.lock,\
+ if [ ! -e $(DEPS_DIR)/hex_core/ebin/dep_built ]; then \
+ $(MAKE) $(DEPS_DIR)/hex_core; \
+ $(MAKE) -C $(DEPS_DIR)/hex_core IS_DEP=1; \
+ touch $(DEPS_DIR)/hex_core/ebin/dep_built; \
+ fi)
+
+$(DEPS_DIR)/elixir/ebin/dep_built: | $(ERLANG_MK_TMP)
+ $(verbose) $(call maybe_flock,$(ERLANG_MK_TMP)/elixir.lock,\
+ if [ ! -e $(DEPS_DIR)/elixir/ebin/dep_built ]; then \
+ $(MAKE) $(DEPS_DIR)/elixir; \
+ $(MAKE) -C $(DEPS_DIR)/elixir; \
+ touch $(DEPS_DIR)/elixir/ebin/dep_built; \
+ fi)
+
$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
ifndef IS_APP
@@ -799,6 +950,16 @@ distclean-deps:
$(gen_verbose) rm -rf $(DEPS_DIR)
endif
+ifeq ($(CACHE_DEPS),1)
+cacheclean:: cacheclean-git cacheclean-hex
+
+cacheclean-git:
+ $(gen_verbose) rm -rf $(CACHE_DIR)/git
+
+cacheclean-hex:
+ $(gen_verbose) rm -rf $(CACHE_DIR)/hex
+endif
+
# Forward-declare variables used in core/deps-tools.mk. This is required
# in case plugins use them.
diff --git a/core/elixir.mk b/core/elixir.mk
new file mode 100644
index 0000000..7b6bdd8
--- /dev/null
+++ b/core/elixir.mk
@@ -0,0 +1,201 @@
+# Copyright (c) 2024, Tyler Hughes <[email protected]>
+# Copyright (c) 2024, Loïc Hoguin <[email protected]>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(ELIXIR),system)
+# We expect 'elixir' to be on the path.
+ELIXIR_BIN ?= $(shell readlink -f `which elixir`)
+ELIXIR_LIBS ?= $(abspath $(dir $(ELIXIR_BIN))/../lib)
+# Fallback in case 'elixir' is a shim.
+ifeq ($(wildcard $(ELIXIR_LIBS)/elixir/),)
+ELIXIR_LIBS = $(abspath $(shell elixir -e 'IO.puts(:code.lib_dir(:elixir))')/../)
+endif
+ELIXIR_LIBS := $(ELIXIR_LIBS)
+export ELIXIR_LIBS
+ERL_LIBS := $(ERL_LIBS):$(ELIXIR_LIBS)
+else
+ifeq ($(ELIXIR),dep)
+ERL_LIBS := $(ERL_LIBS):$(DEPS_DIR)/elixir/lib/
+endif
+endif
+
+elixirc_verbose_0 = @echo " EXC $(words $(EX_FILES)) files";
+elixirc_verbose_2 = set -x;
+elixirc_verbose = $(elixirc_verbose_$(V))
+
+# Unfortunately this currently requires Elixir.
+# https://github.com/jelly-beam/verl is a good choice
+# for an Erlang implementation, but we already have to
+# pull hex_core and Rebar3 so adding yet another pull
+# is annoying, especially one that would be necessary
+# every time we autopatch Rebar projects. Wait and see.
+define hex_version_resolver.erl
+ HexVersionResolve = fun(Name, Req) ->
+ application:ensure_all_started(ssl),
+ application:ensure_all_started(inets),
+ Config = $(hex_config.erl),
+ case hex_repo:get_package(Config, atom_to_binary(Name)) of
+ {ok, {200, _RespHeaders, Package}} ->
+ #{releases := List} = Package,
+ {value, #{version := Version}} = lists:search(fun(#{version := Vsn}) ->
+ M = list_to_atom("Elixir.Version"),
+ F = list_to_atom("match?"),
+ M:F(Vsn, Req)
+ end, List),
+ {ok, Version};
+ {ok, {Status, _, Errors}} ->
+ {error, Status, Errors}
+ end
+ end,
+ HexVersionResolveAndPrint = fun(Name, Req) ->
+ case HexVersionResolve(Name, Req) of
+ {ok, Version} ->
+ io:format("~s", [Version]),
+ halt(0);
+ {error, Status, Errors} ->
+ io:format("Error ~b: ~0p~n", [Status, Errors]),
+ halt(77)
+ end
+ end
+endef
+
+define dep_autopatch_mix.erl
+ $(call hex_version_resolver.erl),
+ {ok, _} = application:ensure_all_started(elixir),
+ {ok, _} = application:ensure_all_started(mix),
+ MixFile = <<"$(call core_native_path,$(DEPS_DIR)/$1/mix.exs)">>,
+ {Mod, Bin} =
+ case elixir_compiler:file(MixFile, fun(_File, _LexerPid) -> ok end) of
+ [{T = {_, _}, _CheckerPid}] -> T;
+ [T = {_, _}] -> T
+ end,
+ {module, Mod} = code:load_binary(Mod, binary_to_list(MixFile), Bin),
+ Project = Mod:project(),
+ Application = try Mod:application() catch error:undef -> [] end,
+ StartMod = case lists:keyfind(mod, 1, Application) of
+ {mod, {StartMod0, _StartArgs}} ->
+ atom_to_list(StartMod0);
+ _ ->
+ ""
+ end,
+ Write = fun (Text) ->
+ file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+ end,
+ Write([
+ "PROJECT = ", atom_to_list(proplists:get_value(app, Project)), "\n"
+ "PROJECT_DESCRIPTION = ", proplists:get_value(description, Project, ""), "\n"
+ "PROJECT_VERSION = ", proplists:get_value(version, Project, ""), "\n"
+ "PROJECT_MOD = ", StartMod, "\n"
+ "define PROJECT_ENV\n",
+ io_lib:format("~p", [proplists:get_value(env, Application, [])]), "\n"
+ "endef\n\n"]),
+ ExtraApps = lists:usort([eex, elixir, logger, mix] ++ proplists:get_value(extra_applications, Application, [])),
+ Write(["LOCAL_DEPS += ", lists:join(" ", [atom_to_list(App) || App <- ExtraApps]), "\n\n"]),
+ Deps = proplists:get_value(deps, Project, []) -- [elixir_make],
+ IsRequiredProdDep = fun(Opts) ->
+ (proplists:get_value(optional, Opts) =/= true)
+ andalso
+ case proplists:get_value(only, Opts, prod) of
+ prod -> true;
+ L when is_list(L) -> lists:member(prod, L);
+ _ -> false
+ end
+ end,
+ lists:foreach(fun
+ ({Name, Req}) when is_binary(Req) ->
+ {ok, Vsn} = HexVersionResolve(Name, Req),
+ Write(["DEPS += ", atom_to_list(Name), "\n"]),
+ Write(["dep_", atom_to_list(Name), " = hex ", Vsn, " ", atom_to_list(Name), "\n"]);
+ ({Name, Opts}) when is_list(Opts) ->
+ Path = proplists:get_value(path, Opts),
+ case IsRequiredProdDep(Opts) of
+ true when Path =/= undefined ->
+ Write(["DEPS += ", atom_to_list(Name), "\n"]),
+ Write(["dep_", atom_to_list(Name), " = ln ", Path, "\n"]);
+ true when Path =:= undefined ->
+ Write(["DEPS += ", atom_to_list(Name), "\n"]),
+ io:format(standard_error, "Warning: No version given for ~p.", [Name]);
+ false ->
+ ok
+ end;
+ ({Name, Req, Opts}) ->
+ case IsRequiredProdDep(Opts) of
+ true ->
+ {ok, Vsn} = HexVersionResolve(Name, Req),
+ Write(["DEPS += ", atom_to_list(Name), "\n"]),
+ Write(["dep_", atom_to_list(Name), " = hex ", Vsn, " ", atom_to_list(Name), "\n"]);
+ false ->
+ ok
+ end;
+ (_) ->
+ ok
+ end, Deps),
+ case lists:member(elixir_make, proplists:get_value(compilers, Project, [])) of
+ false ->
+ ok;
+ true ->
+ Write("# https://hexdocs.pm/elixir_make/Mix.Tasks.Compile.ElixirMake.html\n"),
+ MakeVal = fun(Key, Proplist, DefaultVal, DefaultReplacement) ->
+ case proplists:get_value(Key, Proplist, DefaultVal) of
+ DefaultVal -> DefaultReplacement;
+ Value -> Value
+ end
+ end,
+ MakeMakefile = binary_to_list(MakeVal(make_makefile, Project, default, <<"Makefile">>)),
+ MakeExe = MakeVal(make_executable, Project, default, "$$\(MAKE)"),
+ MakeCwd = MakeVal(make_cwd, Project, undefined, <<".">>),
+ MakeTargets = MakeVal(make_targets, Project, [], []),
+ MakeArgs = MakeVal(make_args, Project, undefined, []),
+ case file:rename("$(DEPS_DIR)/$1/" ++ MakeMakefile, "$(DEPS_DIR)/$1/elixir_make.mk") of
+ ok -> ok;
+ Err = {error, _} ->
+ io:format(standard_error, "Failed to copy Makefile with error ~p~n", [Err]),
+ halt(90)
+ end,
+ Write(["app::\n"
+ "\t", MakeExe, " -C ", MakeCwd, " -f $(DEPS_DIR)/$1/elixir_make.mk",
+ lists:join(" ", MakeTargets),
+ lists:join(" ", MakeArgs),
+ "\n\n"]),
+ case MakeVal(make_clean, Project, nil, undefined) of
+ undefined ->
+ ok;
+ Clean ->
+ Write(["clean::\n\t", Clean, "\n\n"])
+ end
+ end,
+ Write("ERLC_OPTS = +debug_info\n\n"),
+ Write("include $$\(if $$\(ERLANG_MK_FILENAME),$$\(ERLANG_MK_FILENAME),erlang.mk)"),
+ halt()
+endef
+
+define dep_autopatch_mix
+ sed 's|\(defmodule.*do\)|\1\n try do\n Code.compiler_options(on_undefined_variable: :warn)\n rescue _ -> :ok\n end\n|g' -i $(DEPS_DIR)/$(1)/mix.exs; \
+ $(MAKE) $(DEPS_DIR)/hex_core/ebin/dep_built; \
+ MIX_ENV="$(if $(MIX_ENV),$(strip $(MIX_ENV)),prod)" \
+ $(call erlang,$(call dep_autopatch_mix.erl,$1))
+endef
+
+# We change the group leader so the Elixir io:format output
+# isn't captured as we need to either print the modules on
+# success, or print _ERROR_ on failure.
+define compile_ex.erl
+ {ok, _} = application:ensure_all_started(elixir),
+ {ok, _} = application:ensure_all_started(mix),
+ $(foreach dep,$(LOCAL_DEPS),_ = application:load($(dep)),)
+ ModCode = list_to_atom("Elixir.Code"),
+ ModCode:put_compiler_option(ignore_module_conflict, true),
+ ModComp = list_to_atom("Elixir.Kernel.ParallelCompiler"),
+ ModMixProject = list_to_atom("Elixir.Mix.Project"),
+ erlang:group_leader(whereis(standard_error), self()),
+ ModMixProject:in_project($(PROJECT), ".", [], fun(_MixFile) ->
+ case ModComp:compile_to_path([$(call comma_list,$(patsubst %,<<"%">>,$1))], <<"ebin/">>) of
+ {ok, Modules, _} ->
+ lists:foreach(fun(E) -> io:format(user, "~p ", [E]) end, Modules),
+ halt(0);
+ {error, _ErroredModules, _WarnedModules} ->
+ io:format(user, "_ERROR_", []),
+ halt(1)
+ end
+ end)
+endef
diff --git a/core/erlc.mk b/core/erlc.mk
index 71ba5b9..c956c4d 100644
--- a/core/erlc.mk
+++ b/core/erlc.mk
@@ -49,40 +49,29 @@ mib_verbose_0 = @echo " MIB " $(filter %.bin %.mib,$(?F));
mib_verbose_2 = set -x;
mib_verbose = $(mib_verbose_$(V))
-ifneq ($(wildcard src/),)
+ifneq ($(wildcard src/)$(wildcard lib/),)
# Targets.
-app:: $(if $(wildcard ebin/test),clean) deps
+app:: $(if $(wildcard ebin/test),beam-cache-restore-app) deps
$(verbose) $(MAKE) --no-print-directory $(PROJECT).d
$(verbose) $(MAKE) --no-print-directory app-build
-ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
-define app_file
-{application, '$(PROJECT)', [
- {description, "$(PROJECT_DESCRIPTION)"},
- {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
- {id$(comma)$(space)"$(1)"}$(comma))
- {modules, [$(call comma_list,$(2))]},
- {registered, []},
- {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(foreach dep,$(DEPS),$(call dep_name,$(dep))))]},
- {env, $(subst \,\\,$(PROJECT_ENV))}$(if $(findstring {,$(PROJECT_APP_EXTRA_KEYS)),$(comma)$(newline)$(tab)$(subst \,\\,$(PROJECT_APP_EXTRA_KEYS)),)
-]}.
-endef
-else
+PROJECT_MOD := $(if $(PROJECT_MOD),$(PROJECT_MOD),$(if $(wildcard src/$(PROJECT)_app.erl),$(PROJECT)_app))
+
define app_file
{application, '$(PROJECT)', [
{description, "$(PROJECT_DESCRIPTION)"},
{vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
- {id$(comma)$(space)"$(1)"}$(comma))
- {modules, [$(call comma_list,$(2))]},
- {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
- {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(foreach dep,$(DEPS),$(call dep_name,$(dep))))]},
- {mod, {$(PROJECT_MOD), []}},
+ {id$(comma)$(space)"$1"}$(comma))
+ {modules, [$(call comma_list,$2)]},
+ {registered, [$(if $(PROJECT_MOD),$(call comma_list,$(if $(filter $(PROJECT_MOD),$(PROJECT)_app),$(PROJECT)_sup) $(PROJECT_REGISTERED)))]},
+ {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(OPTIONAL_DEPS) $(foreach dep,$(DEPS),$(call query_name,$(dep))))]},
+ {optional_applications, [$(call comma_list,$(OPTIONAL_DEPS))]},$(if $(PROJECT_MOD),
+ {mod$(comma)$(space){$(patsubst %,'%',$(PROJECT_MOD))$(comma)$(space)[]}}$(comma))
{env, $(subst \,\\,$(PROJECT_ENV))}$(if $(findstring {,$(PROJECT_APP_EXTRA_KEYS)),$(comma)$(newline)$(tab)$(subst \,\\,$(PROJECT_APP_EXTRA_KEYS)),)
]}.
endef
-endif
app-build: ebin/$(PROJECT).app
$(verbose) :
@@ -94,6 +83,9 @@ ALL_SRC_FILES := $(sort $(call core_find,src/,*))
ERL_FILES := $(filter %.erl,$(ALL_SRC_FILES))
CORE_FILES := $(filter %.core,$(ALL_SRC_FILES))
+ALL_LIB_FILES := $(sort $(call core_find,lib/,*))
+EX_FILES := $(filter-out lib/mix/%,$(filter %.ex,$(ALL_SRC_FILES) $(ALL_LIB_FILES)))
+
# ASN.1 files.
ifneq ($(wildcard asn1/),)
@@ -102,7 +94,7 @@ ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
define compile_asn1
$(verbose) mkdir -p include/
- $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(ERLC_ASN1_OPTS) $(1)
+ $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(ERLC_ASN1_OPTS) $1
$(verbose) mv asn1/*.erl src/
-$(verbose) mv asn1/*.hrl include/
$(verbose) mv asn1/*.asn1db include/
@@ -222,7 +214,6 @@ define makedep.erl
end,
MakeDepend = fun
(F, Fd, Mod, StartLocation) ->
- {ok, Filename} = file:pid2name(Fd),
case io:parse_erl_form(Fd, undefined, StartLocation) of
{ok, AbsData, EndLocation} ->
case AbsData of
@@ -265,26 +256,26 @@ define makedep.erl
[233] -> unicode:characters_to_binary(Output0);
_ -> Output0
end,
- ok = file:write_file("$(1)", Output),
+ ok = file:write_file("$1", Output),
halt()
endef
ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+$(PROJECT).d:: $(ERL_FILES) $(EX_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
$(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
endif
ifeq ($(IS_APP)$(IS_DEP),)
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+ifneq ($(words $(ERL_FILES) $(EX_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES) $(EX_FILES)),0)
# Rebuild everything when the Makefile changes.
$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST) | $(ERLANG_MK_TMP)
$(verbose) if test -f $@; then \
- touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+ touch $(ERL_FILES) $(EX_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES) $(EX_FILES); \
touch -c $(PROJECT).d; \
fi
$(verbose) touch $@
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+$(ERL_FILES) $(EX_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
endif
endif
@@ -301,7 +292,7 @@ ebin/:
define compile_erl
$(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
- -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+ -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $1)
endef
define validate_app_file
@@ -311,13 +302,16 @@ define validate_app_file
end
endef
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
- $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src) $(EX_FILES)
+ $(eval FILES_TO_COMPILE := $(filter-out $(EX_FILES) src/$(PROJECT).app.src,$?))
$(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+ $(if $(filter $(ELIXIR),disable),,$(if $(filter $?,$(EX_FILES)),$(elixirc_verbose) $(eval MODULES := $(shell $(call erlang,$(call compile_ex.erl,$(EX_FILES)))))))
+ $(eval ELIXIR_COMP_FAILED := $(if $(filter _ERROR_,$(firstword $(MODULES))),true,false))
# Older git versions do not have the --first-parent flag. Do without in that case.
+ $(verbose) if $(ELIXIR_COMP_FAILED); then exit 1; fi
$(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null \
|| git describe --dirty --abbrev=7 --tags --always 2>/dev/null || true))
- $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+ $(eval MODULES := $(MODULES) $(patsubst %,'%',$(sort $(notdir $(basename \
$(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
ifeq ($(wildcard src/$(PROJECT).app.src),)
$(app_verbose) printf '$(subst %,%%,$(subst $(newline),\n,$(subst ','\'',$(call app_file,$(GITDESCRIBE),$(MODULES)))))' \
diff --git a/core/index.mk b/core/index.mk
index 0b75209..25c5e51 100644
--- a/core/index.mk
+++ b/core/index.mk
@@ -5,7 +5,7 @@
define pkg_print
$(verbose) printf "%s\n" \
- $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name: $(1)") \
+ $(if $(call core_eq,$1,$(pkg_$(1)_name)),,"Pkg name: $1") \
"App name: $(pkg_$(1)_name)" \
"Description: $(pkg_$(1)_description)" \
"Home page: $(pkg_$(1)_homepage)" \
@@ -19,8 +19,8 @@ endef
search:
ifdef q
$(foreach p,$(PACKAGES), \
- $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
- $(call pkg_print,$(p))))
+ $(if $(findstring $(call core_lc,$q),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+ $(call pkg_print,$p)))
else
- $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+ $(foreach p,$(PACKAGES),$(call pkg_print,$p))
endif
diff --git a/core/kerl.mk b/core/kerl.mk
index eec0712..35ce1f3 100644
--- a/core/kerl.mk
+++ b/core/kerl.mk
@@ -21,19 +21,10 @@ KERL_MAKEFLAGS ?=
OTP_GIT ?= https://github.com/erlang/otp
define kerl_otp_target
-$(KERL_INSTALL_DIR)/$(1): $(KERL)
+$(KERL_INSTALL_DIR)/$1: $(KERL)
$(verbose) if [ ! -d $$@ ]; then \
- MAKEFLAGS="$(KERL_MAKEFLAGS)" $(KERL) build git $(OTP_GIT) $(1) $(1); \
- $(KERL) install $(1) $(KERL_INSTALL_DIR)/$(1); \
- fi
-endef
-
-define kerl_hipe_target
-$(KERL_INSTALL_DIR)/$1-native: $(KERL)
- $(verbose) if [ ! -d $$@ ]; then \
- KERL_CONFIGURE_OPTIONS=--enable-native-libs \
- MAKEFLAGS="$(KERL_MAKEFLAGS)" $(KERL) build git $(OTP_GIT) $1 $1-native; \
- $(KERL) install $1-native $(KERL_INSTALL_DIR)/$1-native; \
+ MAKEFLAGS="$(KERL_MAKEFLAGS)" $(KERL) build git $(OTP_GIT) $1 $1; \
+ $(KERL) install $1 $(KERL_INSTALL_DIR)/$1; \
fi
endef
@@ -59,10 +50,10 @@ ERLANG_OTP := $(notdir $(lastword $(sort\
endif
ERLANG_OTP ?=
-ERLANG_HIPE ?=
# Use kerl to enforce a specific Erlang/OTP version for a project.
ifneq ($(strip $(ERLANG_OTP)),)
+
export PATH := $(KERL_INSTALL_DIR)/$(ERLANG_OTP)/bin:$(PATH)
SHELL := env PATH=$(PATH) $(SHELL)
$(eval $(call kerl_otp_target,$(ERLANG_OTP)))
@@ -73,18 +64,4 @@ $(info Building Erlang/OTP $(ERLANG_OTP)... Please wait...)
$(shell $(MAKE) $(KERL_INSTALL_DIR)/$(ERLANG_OTP) ERLANG_OTP=$(ERLANG_OTP) BUILD_ERLANG_OTP=1 >&2)
endif
-else
-# Same for a HiPE enabled VM.
-ifneq ($(strip $(ERLANG_HIPE)),)
-export PATH := $(KERL_INSTALL_DIR)/$(ERLANG_HIPE)-native/bin:$(PATH)
-SHELL := env PATH=$(PATH) $(SHELL)
-$(eval $(call kerl_hipe_target,$(ERLANG_HIPE)))
-
-# Build Erlang/OTP only if it doesn't already exist.
-ifeq ($(wildcard $(KERL_INSTALL_DIR)/$(ERLANG_HIPE)-native)$(BUILD_ERLANG_OTP),)
-$(info Building HiPE-enabled Erlang/OTP $(ERLANG_OTP)... Please wait...)
-$(shell $(MAKE) $(KERL_INSTALL_DIR)/$(ERLANG_HIPE)-native ERLANG_HIPE=$(ERLANG_HIPE) BUILD_ERLANG_OTP=1 >&2)
-endif
-
-endif
endif
diff --git a/core/test.mk b/core/test.mk
index 8054abc..d576619 100644
--- a/core/test.mk
+++ b/core/test.mk
@@ -41,18 +41,21 @@ test_erlc_verbose = $(test_erlc_verbose_$(V))
define compile_test_erl
$(test_erlc_verbose) erlc -v $(TEST_ERLC_OPTS) -o $(TEST_DIR) \
- -pa ebin/ -I include/ $(1)
+ -pa ebin/ -I include/ $1
endef
ERL_TEST_FILES = $(call core_find,$(TEST_DIR)/,*.erl)
+
$(ERLANG_MK_TMP)/$(PROJECT).last-testdir-build: $(ERL_TEST_FILES) $(MAKEFILE_LIST)
- $(eval FILES_TO_COMPILE := $(if $(filter $(MAKEFILE_LIST),$?),$(filter $(ERL_TEST_FILES),$^),$?))
+# When we have to recompile files in src/ the .d file always gets rebuilt.
+# Therefore we want to ignore it when rebuilding test files.
+ $(eval FILES_TO_COMPILE := $(if $(filter $(filter-out $(PROJECT).d,$(MAKEFILE_LIST)),$?),$(filter $(ERL_TEST_FILES),$^),$(filter $(ERL_TEST_FILES),$?)))
$(if $(strip $(FILES_TO_COMPILE)),$(call compile_test_erl,$(FILES_TO_COMPILE)) && touch $@)
endif
test-build:: IS_TEST=1
test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: $(if $(wildcard src),$(if $(wildcard ebin/test),,clean)) $(if $(IS_APP),,deps test-deps)
+test-build:: $(if $(wildcard src),$(if $(wildcard ebin/test),,beam-cache-restore-test)) $(if $(IS_APP),,deps test-deps)
# We already compiled everything when IS_APP=1.
ifndef IS_APP
ifneq ($(wildcard src),)
diff --git a/doc/src/guide/book.asciidoc b/doc/src/guide/book.asciidoc
index 7c4ee68..65c09b9 100644
--- a/doc/src/guide/book.asciidoc
+++ b/doc/src/guide/book.asciidoc
@@ -36,6 +36,8 @@ include::cross_compiling.asciidoc[Cross compiling]
include::compat.asciidoc[Compatibility with other build tools]
+include::elixir.asciidoc[Elixir modules and dependencies]
+
[[docs]]
= Documentation
diff --git a/doc/src/guide/ci.asciidoc b/doc/src/guide/ci.asciidoc
index 2b69e28..2fa5feb 100644
--- a/doc/src/guide/ci.asciidoc
+++ b/doc/src/guide/ci.asciidoc
@@ -10,9 +10,7 @@ section of the xref:kerl[OTP version management] chapter.)
=== Configuring Erlang/OTP versions to test
To use the CI plugin you must first configure which versions
-of Erlang/OTP will be used. Erlang.mk provides three separate
-configuration variables depending on whether you need a normal
-OTP release, a HiPE-enabled release or an ErLLVM-enabled release.
+of Erlang/OTP will be used.
At the time of writing, this is how you would test against all
the most recent patch releases of Erlang/OTP 19 and above:
@@ -20,13 +18,6 @@ the most recent patch releases of Erlang/OTP 19 and above:
[source,make]
CI_OTP = OTP-19.0.7 OTP-19.1.6 OTP-19.2.3 OTP-19.3.6.2 OTP-20.0.4
-If you want to test against HiPE and ErLLVM but only with the
-latest version of Erlang/OTP, the following could work:
-
-[source,make]
-CI_HIPE = $(lastword $(CI_OTP))
-CI_ERLLVM = $(CI_HIPE)
-
Consult the xref:kerl[OTP version management] chapter for more
information about Erlang/OTP versions and customization of the
Erlang/OTP builds.
diff --git a/doc/src/guide/common_test.asciidoc b/doc/src/guide/common_test.asciidoc
index 993bb8c..05e43eb 100644
--- a/doc/src/guide/common_test.asciidoc
+++ b/doc/src/guide/common_test.asciidoc
@@ -99,5 +99,11 @@ the test suite does not group test cases:
[source,bash]
$ make ct-http c=headers_dupe
+A test within a specific subgroup can be run by providing a
+group path:
+
+[source,bash]
+$ make ct-http t=[top_level_group,second_level_group,third_level_group]:my_case
+
Finally, xref:coverage[code coverage] is available,
but covered in its own chapter.
diff --git a/doc/src/guide/coverage.asciidoc b/doc/src/guide/coverage.asciidoc
index 02f8b5b..af159d8 100644
--- a/doc/src/guide/coverage.asciidoc
+++ b/doc/src/guide/coverage.asciidoc
@@ -46,6 +46,17 @@ some applications by defining the `COVER_APPS` variable:
[source,make]
COVER_APPS = presence backend
+=== Removing modules from the cover report
+
+By default Erlang.mk will include all modules in the
+cover report.
+
+To exclude some modules from the report, you can
+define the `COVER_EXCLUDE_MODS` variable:
+
+[source,make]
+COVER_EXCLUDE_MODS = cowboy_app cowboy_sup
+
=== Configuring paths
By default Erlang.mk will store 'coverdata' files and
diff --git a/doc/src/guide/deps.asciidoc b/doc/src/guide/deps.asciidoc
index 081f4f7..1ac2d8a 100644
--- a/doc/src/guide/deps.asciidoc
+++ b/doc/src/guide/deps.asciidoc
@@ -132,6 +132,18 @@ target `deps::` before including 'erlang.mk', for example:
[source,make]
deps:: $(CURDIR)/deps/triq
+Sometimes dependencies are allowed to be missing. However, your application
+may depend on an optional application being started. To ensure that an
+optional dependency is started before your application, the variable
+`OPTIONAL_DEPS` may be used:
+
+[source,make]
+OPTIONAL_DEPS = quicer
+
+The top-level project can then decide whether to include this
+application by adding it to its `BUILD_DEPS` and including
+it in the release dependencies.
+
==== Modifying the dependency source or version
By default, Erlang.mk will look into its package index to
@@ -151,10 +163,10 @@ variable. In the case of Cowboy, this would look like this:
[source,make]
DEPS = cowboy
-dep_cowboy_commit = 2.0.0-pre.2
+dep_cowboy_commit = 2.12.0
Erlang.mk will use the package index to get all information
-about Cowboy, except the commit number which will be overriden.
+about Cowboy, except the commit number which will be overridden.
If you need to set the fetch method or repository information
too, for example because you want to use your own fork, or
@@ -163,7 +175,7 @@ can define the `dep_$(DEP_NAME)` variable with everything:
[source,make]
DEPS = cowboy
-dep_cowboy = git https://github.com/essen/cowboy 2.0.0-pre.2
+dep_cowboy = git https://github.com/essen/cowboy 2.12.0
This will fetch Cowboy from your fork at the given commit.
@@ -252,7 +264,7 @@ If none of the existing methods fit your use, you can simply
define your own. Erlang.mk will consider all variables that
are named as `dep_fetch_$(METHOD)` to be available fetch
methods. You can do anything inside this variable, as long
-as you create a folder named '$(DEPS_DIR)/$(call dep_name,$1)'.
+as you create a folder named '$(DEPS_DIR)/$(call query_name,$1)'.
Or in layman terms, if your dependency is Cowboy, this would
become 'deps/cowboy'.
@@ -261,8 +273,8 @@ To give an example, this is what the Git method does:
[source,make]
----
define dep_fetch_git
- git clone -q -n -- $(call dep_repo,$1) $(DEPS_DIR)/$(call dep_name,$1); \
- cd $(DEPS_DIR)/$(call dep_name,$1) && git checkout -q $(call dep_commit,$1);
+ git clone -q -n -- $(call query_repo_git,$1) $(DEPS_DIR)/$(call query_name,$1); \
+ cd $(DEPS_DIR)/$(call query_name,$1) && git checkout -q $(call query_version_git,$1);
endef
----
@@ -559,10 +571,8 @@ performed:
* Run autopatch on the project
Autopatch first checks if there is any project-specific patch
-enabled. There are currently three: `RABBITMQ_CLIENT_PATCH` for
-the `amqp_client` dependency (before 3.6.0), `RABBITMQ_SERVER_PATCH`
-for the `rabbit` dependency (before 3.6.0) and `ELIXIR_PATCH`
-for the `elixir` dependency.
+enabled. There are currently two: `ELIXIR_PATCH` for the `elixir`
+dependency and `HUT_PATCH` for the `hut` dependency.
Otherwise, autopatch performs different operations depending
on the kind of project it finds the dependency to be.
diff --git a/doc/src/guide/elixir.asciidoc b/doc/src/guide/elixir.asciidoc
new file mode 100644
index 0000000..b868825
--- /dev/null
+++ b/doc/src/guide/elixir.asciidoc
@@ -0,0 +1,86 @@
+[[elixir]]
+== Elixir modules and dependencies
+
+Erlang.mk has experimental support for building Elixir
+modules as well as dependencies. In this chapter we will
+cover the details and gotchas of the Elixir support.
+
+=== Selecting Elixir
+
+By default Elixir is disabled. This is to ensure that
+there's no negative impact to normal users of Erlang.mk.
+
+Erlang.mk can use either an Elixir installed in the
+system; or use Elixir as a dependency.
+
+Elixir will be automatically enabled when Elixir is
+used as a dependency. In that case all that is required
+is to depend on Elixir:
+
+[source,make]
+----
+DEPS = elixir
+dep_elixir_commit = v1.17.3
+----
+
+Alternatively, Erlang.mk will enable the system Elixir
+installation when Elixir files are found in the top-level
+project. In that case, Elixir is assumed to be in the path.
+
+In other cases, the system Elixir installation must be
+enabled manually in order to depend on Elixir applications.
+Note that this is only required for Elixir-only applications,
+not for applications that have both Erlang and Elixir code
+(as long as you only care about the Erlang side of things).
+The `ELIXIR` variable must be defined before including
+Erlang.mk:
+
+[source,make]
+ELIXIR = system
+
+Elixir can be explicitly disabled. In that case trying to
+depend on Elixir applications will result in failure
+during autopatch, unless the Elixir application has both
+Erlang and Elixir code.
+
+[source,make]
+ELIXIR = disable
+
+=== Elixir compilation
+
+There are currently no options.
+
+=== Elixir dependencies
+
+Erlang.mk will automatically autopatch Elixir dependencies
+by running Mix on the mix.exs file and producing a Makefile
+using the generated metadata.
+
+The following is an example of depending on Elixir
+applications from an Erlang-only application:
+
+[source,make]
+----
+DEPS = jose
+dep_jose = hex 1.11.10
+
+ELIXIR = system
+
+include erlang.mk
+----
+
+=== Dialyzer
+
+Dialyzer requires Elixir to be available in order to access
+the AST of the Elixir beam files. In most cases it will just
+work. When only enabling Elixir in a sub-application, Elixir
+will not always be available, so in that case we must tell
+Dialyzer where to find Elixir libraries. This can be done
+by adding the following rules to the relevant Makefiles,
+either as a plugin or after including Erlang.mk:
+
+[source,make]
+----
+dialyze: ELIXIR_LIBS = $(dir $(shell readlink -f `which elixir`))/../lib
+dialyze: ERL_LIBS = $(APPS_DIR):$(DEPS_DIR):$(ELIXIR_LIBS)
+----
diff --git a/doc/src/guide/external_plugins.asciidoc b/doc/src/guide/external_plugins.asciidoc
index 5f165f5..bb42f1a 100644
--- a/doc/src/guide/external_plugins.asciidoc
+++ b/doc/src/guide/external_plugins.asciidoc
@@ -90,7 +90,7 @@ help-plugins::
Plugins declared in `DEP_PLUGINS` are loaded near the end of Erlang.mk.
That's why you have access to all previously initialized variables.
However, if you want your plugin to add common dependencies to
-your applications, a regular is loaded too late in the process.
+your applications, a regular plugin is loaded too late in the process.
You need to use "Early-stage plugins". They are declared using the
`DEP_EARLY_PLUGINS` variable instead. Plugins listed in this variable
are loaded near the beginning of Erlang.mk Otherwise, they work exactly
@@ -111,7 +111,7 @@ DEPS += cowboy
TEST_DEPS = ct_helper
dep_ct_helper = git https://github.com/ninenines/ct_helper master
-=== Loading plugins local to the application
+=== Loading plugins local to the application
If the Erlang.mk plugin lives in the same directory or repository as your
application or library, then you can load it exactly like an external
@@ -138,3 +138,27 @@ your application:
DEP_EARLY_PLUGINS = $(PROJECT)
# Loads ./plugins.mk
DEP_PLUGINS = $(PROJECT)
+
+=== Adding templates via plugins
+
+Plugins may add templates either from within their Makefile or from
+an external file. The recommended method is to use an external file;
+however do note it only works for Make 4 and above:
+
+[source,make]
+THIS := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
+tpl_test_mk = $(file < $(THIS)/templates/my_template.erl)
+
+With 'templates/my_template.erl' containing:
+
+[source,erlang]
+-module(template_name).
+
+Erlang.mk will do string substitution replacing the following
+strings with their equivalent:
+
+* `template_name`: the name provided by the user
+* `project_name`: either `$(PROJECT)` or the target application's name
+* `template_sp`: internal; propagates whitespace settings to Makefiles
+* `rel_deps_dir`: internal; path to deps/* from within an apps/* Makefile
+* `rel_root_dir`: internal; path to top-level directory from within an apps/* Makefile
diff --git a/doc/src/guide/getting_started.asciidoc b/doc/src/guide/getting_started.asciidoc
index be58e87..904cd7d 100644
--- a/doc/src/guide/getting_started.asciidoc
+++ b/doc/src/guide/getting_started.asciidoc
@@ -12,6 +12,11 @@ contain your project.
$ mkdir hello_joe
$ cd hello_joe
+Note that the project directory name must match the name of
+your application for some of the functionality to work (such
+as OTP releases). The name should only include letters, numbers
+or underscore as well for better compatibility.
+
Most people tend to put all their projects side by side in
a common folder. We recommend keeping an organization similar
to your remote repositories. For example, for GitHub users,
@@ -266,8 +271,20 @@ You can list all available templates with the `list-templates`
target:
[source,bash]
+----
$ make list-templates
-Available templates: cowboy_http cowboy_loop cowboy_rest cowboy_ws gen_fsm gen_server gen_statem ranch_protocol supervisor
+Available templates:
+ cowboy_http_h
+ cowboy_loop_h
+ cowboy_rest_h
+ cowboy_websocket_h
+ gen_fsm
+ gen_server
+ gen_statem
+ module
+ ranch_protocol
+ supervisor
+----
To generate a module, let's say a `gen_server`, all you need to
do is to call `make new` with the appropriate arguments:
@@ -345,7 +362,8 @@ Bootstrap targets:
This guide should provide any other answer. If not, please
open a ticket on https://github.com/ninenines/erlang.mk/issues[the official repository]
-and we will work on improving the guide.
+and we will work on improving the guide. For any other questions,
+please visit the https://discord.gg/x25nNq2fFE[Erlang OSS Discord server].
Commercial support is available through Nine Nines. Please contact
Loïc Hoguin by sending an email to mailto:[email protected][].
diff --git a/doc/src/guide/installation.asciidoc b/doc/src/guide/installation.asciidoc
index 0c21fb0..b3ab551 100644
--- a/doc/src/guide/installation.asciidoc
+++ b/doc/src/guide/installation.asciidoc
@@ -82,13 +82,13 @@ MSYS2 in order to use Erlang.mk.
Erlang.mk requires Erlang/OTP to be installed. The OTP team
provides binaries of Erlang/OTP for all major and minor releases,
-available from the http://www.erlang.org/download.html[official download page].
+available from the https://www.erlang.org/downloads[official download page].
It is recommended that you use the 64-bit installer unless
technically impossible. Please follow the instructions from
the installer to complete the installation.
The OTP team also provides a short guide to
-http://www.erlang.org/download.html[installing Erlang/OTP on Windows]
+https://www.erlang.org/downloads[installing Erlang/OTP on Windows]
if you need additional references.
You can install Erlang/OTP silently using the `/S` switch
@@ -134,7 +134,7 @@ C:\> C:\msys64\usr\bin\bash -lc "pacman --noconfirm -Syu"
==== Installing the required MSYS2 packages
After following these instructions, you can install GNU Make,
-Git and any other required softwares. From an MSYS2 shell,
+Git and any other required software. From an MSYS2 shell,
you can call `pacman` directly:
[source,bash]
diff --git a/doc/src/guide/ports.asciidoc b/doc/src/guide/ports.asciidoc
index 907ee36..3be5bf2 100644
--- a/doc/src/guide/ports.asciidoc
+++ b/doc/src/guide/ports.asciidoc
@@ -81,7 +81,7 @@ nothing.
Erlang.mk sets appropriate compile and linker flags by default.
These flags vary depending on the platform, and can of course
-be overriden.
+be overridden.
`CC`::
The compiler to be used.
diff --git a/doc/src/guide/releases.asciidoc b/doc/src/guide/releases.asciidoc
index 68174b3..a3bdb10 100644
--- a/doc/src/guide/releases.asciidoc
+++ b/doc/src/guide/releases.asciidoc
@@ -7,8 +7,15 @@ https://erlware.github.io/relx/[Relx website] for more information.
=== Setup
-Erlang.mk will create a release if it detects a Relx configuration
-file in the '$(RELX_CONFIG)' location. This defaults to
+First, `relx` must be added in the dependencies of your
+project. You can add it to `REL_DEPS` so that it is fetched
+whenever you need to build the release:
+
+[source,erlang]
+REL_DEPS = relx
+
+Then, you need to create a 'relx.config' file in the
+'$(RELX_CONFIG)' location. This defaults to
'$(CURDIR)/relx.config'. You can override it by defining
the variable before including Erlang.mk:
@@ -29,14 +36,6 @@ RELX_CONFIG = $(CURDIR)/relx.dev.config
endif
----
-Relx does not need to be installed. Erlang.mk will download
-and build it automatically.
-
-The Relx executable will be saved in the '$(RELX)' file. This
-location defaults to '$(CURDIR)/relx' and can be overriden.
-
-// @todo You can use a custom location by ???
-
=== Configuration
You can specify additional Relx options using the `RELX_OPTS`
diff --git a/doc/src/guide/xref.asciidoc b/doc/src/guide/xref.asciidoc
index 44ed190..07bf05e 100644
--- a/doc/src/guide/xref.asciidoc
+++ b/doc/src/guide/xref.asciidoc
@@ -1,6 +1,183 @@
[[xref]]
== Xref
-// @todo Write it.
+Xref is a cross reference tool for analyzing dependencies
+between functions, modules, applications and releases.
+Erlang.mk provides an interface to analyzing all except
+the releases.
-Placeholder chapter.
+Both predefined checks and custom queries are supported
+in Erlang.mk.
+
+=== Usage
+
+To run Xref with the default predefined checks:
+
+[source,bash]
+$ make xref
+
+Erlang.mk will error out when warnings are found.
+
+The following predefined checks can be used:
+
+* `undefined_function_calls`
+* `undefined_functions` (similar to the previous)
+* `locals_not_used` (detected by the compiler)
+* `exports_not_used`
+* `deprecated_function_calls` (also detected by the compiler)
+* `deprecated_functions` (similar to the previous)
+* `{deprecated_function_calls, Flag}`
+* `{deprecated_functions, Flag}` (similar to the previous)
+
+Erlang.mk will only run the `undefined_function_calls`
+check by default.
+
+To change the check the `XREF_CHECKS` variable can be used:
+
+[source,bash]
+$ make xref XREF_CHECKS=exports_not_used
+
+Multiple checks can be run at once. The checks variable
+must be defined as an Erlang list:
+
+[source,bash]
+$ make xref XREF_CHECKS="[undefined_function_calls, exports_not_used]"
+
+Erlang.mk also supports informational analyses. Those will
+not error out when results are found, since they are not
+errors. To find all modules that call `cowboy_req` functions:
+
+[source,bash]
+$ make xref XREF_CHECKS="{module_use, cowboy_req}"
+
+The following informational checks are supported:
+
+* `{call, MFA}` - functions that MFA calls
+* `{use, MFA}` - functions that call MFA
+* `{module_call, Mod}` - modules that Mod calls (Mod depends on them)
+* `{module_use, Mod}` - modules that call Mod (they depend on Mod)
+* `{application_call, App}` - apps that App calls (App depends on them)
+* `{application_use, App}` - apps that call App (they depend on App)
+
+The scope might need to be increased in order to obtain
+the complete results of informational checks. This is
+especially true for module and applications, with
+application results being dependent on the applications
+being added to the scope to be found.
+
+=== Queries
+
+Erlang.mk provides an interface to the Xref query
+functions. To perform a query, the `q` variable
+must be used instead of `XREF_CHECKS`. For example,
+to obtain all unresolved calls:
+
+[source,bash]
+$ make xref q=UC
+
+The query language is documented at the top of the
+link:https://www.erlang.org/doc/man/xref.html[Xref manual page].
+
+=== Analysis scope
+
+Erlang.mk will set the scope of analysis to the current
+project by default. The scope can be automatically
+extended to the applications from multi-application
+repositories, to dependencies and to the built-in
+Erlang/OTP applications themselves.
+
+To change the scope, the `XREF_SCOPE` variable can be
+set. The variable can either be set in your Makefile
+or from the command line. The following values can
+be defined:
+
+* `app` - the current project
+* `apps` - applications from multi-application repositories
+* `deps` - dependencies
+* `otp` - Erlang/OTP applications
+
+To get the most complete analysis possible they should
+all be added to the variable:
+
+[source,bash]
+----
+$ make xref XREF_CHECKS="{application_use, ssl}" XREF_SCOPE="app apps deps otp"
+Application ssl is used by:
+- my_app
+- diameter
+- eldap
+- ftp
+- inets
+- ssl
+----
+
+Additional applications can be provided using the
+`XREF_EXTRA_APP_DIRS` variable. Note that these
+applications will need to be compiled before they
+can be found by Xref.
+
+Similarly, non-application directories can be
+added using `XREF_EXTRA_DIRS`. The directory
+to be provided must be the one that contains
+the beam files.
+
+=== Ignoring warnings
+
+Sometimes it is necessary to ignore warnings because
+they are expected. This is the case for example
+when multiple Erlang/OTP versions must be supported
+and modules or functions have been added or removed.
+
+Erlang.mk supports both project-wide configuration
+and Rebar-compatible inline ignores. To ignore
+warnings for a function in the current module the
+following line can be added to the source file:
+
+[source,erlang]
+----
+-ignore_xref({log, 1}).
+----
+
+The module name can be specified explicitly:
+
+[source,erlang]
+----
+-ignore_xref({my_mod, log, 1}).
+----
+
+As well as a full module can be ignored:
+
+[source,erlang]
+----
+-ignore_xref(my_mod).
+----
+
+The ignored functions can be provided as a list:
+
+[source,erlang]
+----
+-ignore_xref([{log, 1}, {pretty_print, 1}]).
+----
+
+The `XREF_IGNORE` variable can be used to define
+functions and modules to ignore project-wide. It
+accepts either MFAs or modules:
+
+[source,make]
+XREF_IGNORE = {my_mod, log, 1}
+
+Multiple ignores must be provided as an Erlang
+list:
+
+[source,make]
+XREF_IGNORE = [{my_mod, log, 1}, other_mod]
+
+By default Erlang.mk will ignore unused exports
+for behavior callbacks when the `exports_not_used`
+check is run. It is possible to override this
+behavior, or to ignore the callbacks for queries
+and other checks, by defining the `XREF_IGNORE_CALLBACKS`
+variable:
+
+[source,bash]
+$ make xref XREF_CHECKS=exports_not_used XREF_IGNORE_CALLBACKS=0
diff --git a/index/aberth.mk b/index/aberth.mk
deleted file mode 100644
index 4a34651..0000000
--- a/index/aberth.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
diff --git a/index/active.mk b/index/active.mk
deleted file mode 100644
index f91b195..0000000
--- a/index/active.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
diff --git a/index/actordb_core.mk b/index/actordb_core.mk
deleted file mode 100644
index 9e4abc9..0000000
--- a/index/actordb_core.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
diff --git a/index/actordb_thrift.mk b/index/actordb_thrift.mk
deleted file mode 100644
index f39ac65..0000000
--- a/index/actordb_thrift.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
diff --git a/index/aleppo.mk b/index/aleppo.mk
deleted file mode 100644
index 9f5a227..0000000
--- a/index/aleppo.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
diff --git a/index/alog.mk b/index/alog.mk
deleted file mode 100644
index 9eccd05..0000000
--- a/index/alog.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
diff --git a/index/amqp_client.mk b/index/amqp_client.mk
deleted file mode 100644
index 13e7f48..0000000
--- a/index/amqp_client.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
diff --git a/index/annotations.mk b/index/annotations.mk
deleted file mode 100644
index 8ef682d..0000000
--- a/index/annotations.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
diff --git a/index/antidote.mk b/index/antidote.mk
deleted file mode 100644
index ea590b2..0000000
--- a/index/antidote.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
diff --git a/index/apns.mk b/index/apns.mk
deleted file mode 100644
index 538278a..0000000
--- a/index/apns.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = master
diff --git a/index/azdht.mk b/index/azdht.mk
deleted file mode 100644
index 04e36d9..0000000
--- a/index/azdht.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
diff --git a/index/backoff.mk b/index/backoff.mk
deleted file mode 100644
index 9ebc405..0000000
--- a/index/backoff.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
diff --git a/index/barrel_tcp.mk b/index/barrel_tcp.mk
deleted file mode 100644
index fae8f4d..0000000
--- a/index/barrel_tcp.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
diff --git a/index/basho_bench.mk b/index/basho_bench.mk
deleted file mode 100644
index 4796284..0000000
--- a/index/basho_bench.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
diff --git a/index/bcrypt.mk b/index/bcrypt.mk
deleted file mode 100644
index acde9df..0000000
--- a/index/bcrypt.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/erlangpack/bcrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/erlangpack/bcrypt.git
-pkg_bcrypt_commit = master
diff --git a/index/beam.mk b/index/beam.mk
deleted file mode 100644
index 44da5d0..0000000
--- a/index/beam.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
diff --git a/index/beanstalk.mk b/index/beanstalk.mk
deleted file mode 100644
index 799feaa..0000000
--- a/index/beanstalk.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
diff --git a/index/bear.mk b/index/bear.mk
deleted file mode 100644
index 547d333..0000000
--- a/index/bear.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
diff --git a/index/bertconf.mk b/index/bertconf.mk
deleted file mode 100644
index f3aa1e1..0000000
--- a/index/bertconf.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
diff --git a/index/bifrost.mk b/index/bifrost.mk
deleted file mode 100644
index 40eb4a5..0000000
--- a/index/bifrost.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
diff --git a/index/binpp.mk b/index/binpp.mk
deleted file mode 100644
index 8804261..0000000
--- a/index/binpp.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
diff --git a/index/bisect.mk b/index/bisect.mk
deleted file mode 100644
index 7815868..0000000
--- a/index/bisect.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
diff --git a/index/bitcask.mk b/index/bitcask.mk
deleted file mode 100644
index 31930f3..0000000
--- a/index/bitcask.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = develop
diff --git a/index/bitstore.mk b/index/bitstore.mk
deleted file mode 100644
index 67ec24f..0000000
--- a/index/bitstore.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
diff --git a/index/bootstrap.mk b/index/bootstrap.mk
deleted file mode 100644
index 4c705a4..0000000
--- a/index/bootstrap.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
diff --git a/index/boss.mk b/index/boss.mk
deleted file mode 100644
index 3fbc1de..0000000
--- a/index/boss.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
diff --git a/index/boss_db.mk b/index/boss_db.mk
deleted file mode 100644
index ef0c80f..0000000
--- a/index/boss_db.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
diff --git a/index/brod.mk b/index/brod.mk
deleted file mode 100644
index 2650f2c..0000000
--- a/index/brod.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += brod
-pkg_brod_name = brod
-pkg_brod_description = Kafka client in Erlang
-pkg_brod_homepage = https://github.com/klarna/brod
-pkg_brod_fetch = git
-pkg_brod_repo = https://github.com/klarna/brod.git
-pkg_brod_commit = master
diff --git a/index/bson.mk b/index/bson.mk
deleted file mode 100644
index 729722b..0000000
--- a/index/bson.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
diff --git a/index/bullet.mk b/index/bullet.mk
deleted file mode 100644
index e365674..0000000
--- a/index/bullet.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
diff --git a/index/cache.mk b/index/cache.mk
deleted file mode 100644
index 82a7627..0000000
--- a/index/cache.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
diff --git a/index/cake.mk b/index/cake.mk
deleted file mode 100644
index a60ddf5..0000000
--- a/index/cake.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = master
diff --git a/index/carotene.mk b/index/carotene.mk
deleted file mode 100644
index 9eee089..0000000
--- a/index/carotene.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
diff --git a/index/cberl.mk b/index/cberl.mk
deleted file mode 100644
index 90aa02b..0000000
--- a/index/cberl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
diff --git a/index/cecho.mk b/index/cecho.mk
deleted file mode 100644
index 5cd82e3..0000000
--- a/index/cecho.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
diff --git a/index/cferl.mk b/index/cferl.mk
deleted file mode 100644
index 18ca586..0000000
--- a/index/cferl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
diff --git a/index/chaos_monkey.mk b/index/chaos_monkey.mk
deleted file mode 100644
index e89d263..0000000
--- a/index/chaos_monkey.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY. It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
diff --git a/index/check_node.mk b/index/check_node.mk
deleted file mode 100644
index f95316c..0000000
--- a/index/check_node.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
diff --git a/index/chronos.mk b/index/chronos.mk
deleted file mode 100644
index b538f1c..0000000
--- a/index/chronos.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
diff --git a/index/chumak.mk b/index/chumak.mk
deleted file mode 100644
index 38cd113..0000000
--- a/index/chumak.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += chumak
-pkg_chumak_name = chumak
-pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
-pkg_chumak_homepage = http://choven.ca
-pkg_chumak_fetch = git
-pkg_chumak_repo = https://github.com/chovencorp/chumak
-pkg_chumak_commit = master
diff --git a/index/cl.mk b/index/cl.mk
deleted file mode 100644
index 8df503e..0000000
--- a/index/cl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
diff --git a/index/clique.mk b/index/clique.mk
deleted file mode 100644
index 46fa5e5..0000000
--- a/index/clique.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
diff --git a/index/cloudi_core.mk b/index/cloudi_core.mk
deleted file mode 100644
index 496202b..0000000
--- a/index/cloudi_core.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
diff --git a/index/cloudi_service_api_requests.mk b/index/cloudi_service_api_requests.mk
deleted file mode 100644
index 8728cb4..0000000
--- a/index/cloudi_service_api_requests.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
diff --git a/index/cloudi_service_db.mk b/index/cloudi_service_db.mk
deleted file mode 100644
index d8adf91..0000000
--- a/index/cloudi_service_db.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
diff --git a/index/cloudi_service_db_cassandra.mk b/index/cloudi_service_db_cassandra.mk
deleted file mode 100644
index e4d1c0b..0000000
--- a/index/cloudi_service_db_cassandra.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
diff --git a/index/cloudi_service_db_cassandra_cql.mk b/index/cloudi_service_db_cassandra_cql.mk
deleted file mode 100644
index b362832..0000000
--- a/index/cloudi_service_db_cassandra_cql.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
diff --git a/index/cloudi_service_db_couchdb.mk b/index/cloudi_service_db_couchdb.mk
deleted file mode 100644
index 864a784..0000000
--- a/index/cloudi_service_db_couchdb.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
diff --git a/index/cloudi_service_db_elasticsearch.mk b/index/cloudi_service_db_elasticsearch.mk
deleted file mode 100644
index b556ee5..0000000
--- a/index/cloudi_service_db_elasticsearch.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
diff --git a/index/cloudi_service_db_memcached.mk b/index/cloudi_service_db_memcached.mk
deleted file mode 100644
index 2f28796..0000000
--- a/index/cloudi_service_db_memcached.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
diff --git a/index/cloudi_service_db_mysql.mk b/index/cloudi_service_db_mysql.mk
deleted file mode 100644
index 39cf4c9..0000000
--- a/index/cloudi_service_db_mysql.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
diff --git a/index/cloudi_service_db_pgsql.mk b/index/cloudi_service_db_pgsql.mk
deleted file mode 100644
index 5a6cb41..0000000
--- a/index/cloudi_service_db_pgsql.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
diff --git a/index/cloudi_service_db_riak.mk b/index/cloudi_service_db_riak.mk
deleted file mode 100644
index 471fa42..0000000
--- a/index/cloudi_service_db_riak.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
diff --git a/index/cloudi_service_db_tokyotyrant.mk b/index/cloudi_service_db_tokyotyrant.mk
deleted file mode 100644
index b2cf9d1..0000000
--- a/index/cloudi_service_db_tokyotyrant.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
diff --git a/index/cloudi_service_filesystem.mk b/index/cloudi_service_filesystem.mk
deleted file mode 100644
index 9c6287b..0000000
--- a/index/cloudi_service_filesystem.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
diff --git a/index/cloudi_service_http_client.mk b/index/cloudi_service_http_client.mk
deleted file mode 100644
index 203b83f..0000000
--- a/index/cloudi_service_http_client.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
diff --git a/index/cloudi_service_http_cowboy.mk b/index/cloudi_service_http_cowboy.mk
deleted file mode 100644
index 0dcb8b8..0000000
--- a/index/cloudi_service_http_cowboy.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
diff --git a/index/cloudi_service_http_elli.mk b/index/cloudi_service_http_elli.mk
deleted file mode 100644
index 5b134fa..0000000
--- a/index/cloudi_service_http_elli.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
diff --git a/index/cloudi_service_map_reduce.mk b/index/cloudi_service_map_reduce.mk
deleted file mode 100644
index 8a4766d..0000000
--- a/index/cloudi_service_map_reduce.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
diff --git a/index/cloudi_service_oauth1.mk b/index/cloudi_service_oauth1.mk
deleted file mode 100644
index ac7857e..0000000
--- a/index/cloudi_service_oauth1.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
diff --git a/index/cloudi_service_queue.mk b/index/cloudi_service_queue.mk
deleted file mode 100644
index e7727cc..0000000
--- a/index/cloudi_service_queue.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
diff --git a/index/cloudi_service_quorum.mk b/index/cloudi_service_quorum.mk
deleted file mode 100644
index f38496b..0000000
--- a/index/cloudi_service_quorum.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
diff --git a/index/cloudi_service_router.mk b/index/cloudi_service_router.mk
deleted file mode 100644
index 9096b37..0000000
--- a/index/cloudi_service_router.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
diff --git a/index/cloudi_service_tcp.mk b/index/cloudi_service_tcp.mk
deleted file mode 100644
index 263413e..0000000
--- a/index/cloudi_service_tcp.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
diff --git a/index/cloudi_service_timers.mk b/index/cloudi_service_timers.mk
deleted file mode 100644
index 4a6e44d..0000000
--- a/index/cloudi_service_timers.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
diff --git a/index/cloudi_service_udp.mk b/index/cloudi_service_udp.mk
deleted file mode 100644
index 16d8670..0000000
--- a/index/cloudi_service_udp.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
diff --git a/index/cloudi_service_validate.mk b/index/cloudi_service_validate.mk
deleted file mode 100644
index 4ee9a72..0000000
--- a/index/cloudi_service_validate.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
diff --git a/index/cloudi_service_zeromq.mk b/index/cloudi_service_zeromq.mk
deleted file mode 100644
index 2352a56..0000000
--- a/index/cloudi_service_zeromq.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
diff --git a/index/cluster_info.mk b/index/cluster_info.mk
deleted file mode 100644
index 39968be..0000000
--- a/index/cluster_info.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
diff --git a/index/color.mk b/index/color.mk
deleted file mode 100644
index 27d39ac..0000000
--- a/index/color.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
diff --git a/index/confetti.mk b/index/confetti.mk
deleted file mode 100644
index 06995d8..0000000
--- a/index/confetti.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
diff --git a/index/couchbeam.mk b/index/couchbeam.mk
deleted file mode 100644
index ef9cef8..0000000
--- a/index/couchbeam.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
diff --git a/index/covertool.mk b/index/covertool.mk
deleted file mode 100644
index e67b4a4..0000000
--- a/index/covertool.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
diff --git a/index/cowboy.mk b/index/cowboy.mk
index f84b24a..da90f81 100644
--- a/index/cowboy.mk
+++ b/index/cowboy.mk
@@ -4,4 +4,4 @@ pkg_cowboy_description = Small, fast and modular HTTP server.
pkg_cowboy_homepage = http://ninenines.eu
pkg_cowboy_fetch = git
pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.4
+pkg_cowboy_commit = master
diff --git a/index/cowdb.mk b/index/cowdb.mk
deleted file mode 100644
index 76c8e72..0000000
--- a/index/cowdb.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
diff --git a/index/cowlib.mk b/index/cowlib.mk
index 0650ff9..b237a1b 100644
--- a/index/cowlib.mk
+++ b/index/cowlib.mk
@@ -4,4 +4,4 @@ pkg_cowlib_description = Support library for manipulating Web protocols.
pkg_cowlib_homepage = http://ninenines.eu
pkg_cowlib_fetch = git
pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.2
+pkg_cowlib_commit = master
diff --git a/index/cpg.mk b/index/cpg.mk
deleted file mode 100644
index 7d62334..0000000
--- a/index/cpg.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
diff --git a/index/cqerl.mk b/index/cqerl.mk
deleted file mode 100644
index 18f25a3..0000000
--- a/index/cqerl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
diff --git a/index/cr.mk b/index/cr.mk
deleted file mode 100644
index 04e0af1..0000000
--- a/index/cr.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
diff --git a/index/cuttlefish.mk b/index/cuttlefish.mk
deleted file mode 100644
index 6101f0f..0000000
--- a/index/cuttlefish.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = cuttlefish configuration abstraction
-pkg_cuttlefish_homepage = https://github.com/Kyorai/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/Kyorai/cuttlefish
-pkg_cuttlefish_commit = master
diff --git a/index/damocles.mk b/index/damocles.mk
deleted file mode 100644
index cbd2595..0000000
--- a/index/damocles.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
diff --git a/index/debbie.mk b/index/debbie.mk
deleted file mode 100644
index a0513d7..0000000
--- a/index/debbie.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
diff --git a/index/decimal.mk b/index/decimal.mk
deleted file mode 100644
index 9b50847..0000000
--- a/index/decimal.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
diff --git a/index/detergent.mk b/index/detergent.mk
deleted file mode 100644
index 2af4d4c..0000000
--- a/index/detergent.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
diff --git a/index/detest.mk b/index/detest.mk
deleted file mode 100644
index 36d0f8b..0000000
--- a/index/detest.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
diff --git a/index/dh_date.mk b/index/dh_date.mk
deleted file mode 100644
index c564dd3..0000000
--- a/index/dh_date.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
diff --git a/index/dirbusterl.mk b/index/dirbusterl.mk
deleted file mode 100644
index 5fcc2ab..0000000
--- a/index/dirbusterl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
diff --git a/index/dispcount.mk b/index/dispcount.mk
deleted file mode 100644
index fcfce51..0000000
--- a/index/dispcount.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
diff --git a/index/dlhttpc.mk b/index/dlhttpc.mk
deleted file mode 100644
index 6805acc..0000000
--- a/index/dlhttpc.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
diff --git a/index/dns.mk b/index/dns.mk
deleted file mode 100644
index 0cd1325..0000000
--- a/index/dns.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
diff --git a/index/dnssd.mk b/index/dnssd.mk
deleted file mode 100644
index 010d6b2..0000000
--- a/index/dnssd.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
diff --git a/index/dynamic_compile.mk b/index/dynamic_compile.mk
deleted file mode 100644
index 142d14d..0000000
--- a/index/dynamic_compile.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
diff --git a/index/e2.mk b/index/e2.mk
deleted file mode 100644
index d2aa1de..0000000
--- a/index/e2.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
diff --git a/index/eamf.mk b/index/eamf.mk
deleted file mode 100644
index 3d4d711..0000000
--- a/index/eamf.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
diff --git a/index/eavro.mk b/index/eavro.mk
deleted file mode 100644
index 9ff4f97..0000000
--- a/index/eavro.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
diff --git a/index/ecapnp.mk b/index/ecapnp.mk
deleted file mode 100644
index ac9e469..0000000
--- a/index/ecapnp.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
diff --git a/index/econfig.mk b/index/econfig.mk
deleted file mode 100644
index 3afa976..0000000
--- a/index/econfig.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
diff --git a/index/edate.mk b/index/edate.mk
deleted file mode 100644
index f9ee33a..0000000
--- a/index/edate.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
diff --git a/index/edgar.mk b/index/edgar.mk
deleted file mode 100644
index 07a3601..0000000
--- a/index/edgar.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
diff --git a/index/edis.mk b/index/edis.mk
deleted file mode 100644
index f6d66bd..0000000
--- a/index/edis.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
diff --git a/index/edns.mk b/index/edns.mk
deleted file mode 100644
index 7f984b6..0000000
--- a/index/edns.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
diff --git a/index/edown.mk b/index/edown.mk
deleted file mode 100644
index 3c62927..0000000
--- a/index/edown.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
diff --git a/index/eep.mk b/index/eep.mk
deleted file mode 100644
index e7754ec..0000000
--- a/index/eep.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
diff --git a/index/eep_app.mk b/index/eep_app.mk
deleted file mode 100644
index 5202c67..0000000
--- a/index/eep_app.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
diff --git a/index/efene.mk b/index/efene.mk
deleted file mode 100644
index 7911cd4..0000000
--- a/index/efene.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
diff --git a/index/egeoip.mk b/index/egeoip.mk
deleted file mode 100644
index 7647431..0000000
--- a/index/egeoip.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
diff --git a/index/ehsa.mk b/index/ehsa.mk
deleted file mode 100644
index 0d1bfac..0000000
--- a/index/ehsa.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = default
diff --git a/index/ej.mk b/index/ej.mk
deleted file mode 100644
index 7342074..0000000
--- a/index/ej.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
diff --git a/index/ejabberd.mk b/index/ejabberd.mk
deleted file mode 100644
index 25ca983..0000000
--- a/index/ejabberd.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
diff --git a/index/ejwt.mk b/index/ejwt.mk
deleted file mode 100644
index ead6a55..0000000
--- a/index/ejwt.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
diff --git a/index/ekaf.mk b/index/ekaf.mk
deleted file mode 100644
index 00707ad..0000000
--- a/index/ekaf.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
diff --git a/index/elarm.mk b/index/elarm.mk
deleted file mode 100644
index 9d32844..0000000
--- a/index/elarm.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
diff --git a/index/eleveldb.mk b/index/eleveldb.mk
deleted file mode 100644
index 07d7ceb..0000000
--- a/index/eleveldb.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
diff --git a/index/elixir.mk b/index/elixir.mk
index d1d4f05..86f89e7 100644
--- a/index/elixir.mk
+++ b/index/elixir.mk
@@ -1,7 +1,7 @@
PACKAGES += elixir
pkg_elixir_name = elixir
-pkg_elixir_description = Elixir is a dynamic, functional language designed for building scalable and maintainable applications
-pkg_elixir_homepage = https://elixir-lang.org/
+pkg_elixir_description = Elixir is a dynamic, functional language for building scalable and maintainable applications.
+pkg_elixir_homepage = https://elixir-lang.org
pkg_elixir_fetch = git
pkg_elixir_repo = https://github.com/elixir-lang/elixir
-pkg_elixir_commit = master
+pkg_elixir_commit = main
diff --git a/index/elli.mk b/index/elli.mk
deleted file mode 100644
index f76f838..0000000
--- a/index/elli.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/elli-lib/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/elli-lib/elli
-pkg_elli_commit = master
diff --git a/index/elvis.mk b/index/elvis.mk
deleted file mode 100644
index b9ca83d..0000000
--- a/index/elvis.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = master
diff --git a/index/emagick.mk b/index/emagick.mk
deleted file mode 100644
index 223143e..0000000
--- a/index/emagick.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
diff --git a/index/emysql.mk b/index/emysql.mk
deleted file mode 100644
index 5211f5d..0000000
--- a/index/emysql.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
diff --git a/index/enm.mk b/index/enm.mk
deleted file mode 100644
index 91bbd3e..0000000
--- a/index/enm.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
diff --git a/index/entop.mk b/index/entop.mk
deleted file mode 100644
index eda448c..0000000
--- a/index/entop.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
diff --git a/index/epcap.mk b/index/epcap.mk
deleted file mode 100644
index 1db65de..0000000
--- a/index/epcap.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
diff --git a/index/eper.mk b/index/eper.mk
deleted file mode 100644
index cded35e..0000000
--- a/index/eper.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
diff --git a/index/epgsql.mk b/index/epgsql.mk
deleted file mode 100644
index 65ea0b6..0000000
--- a/index/epgsql.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
diff --git a/index/episcina.mk b/index/episcina.mk
deleted file mode 100644
index f12b420..0000000
--- a/index/episcina.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
diff --git a/index/eplot.mk b/index/eplot.mk
deleted file mode 100644
index 301b51a..0000000
--- a/index/eplot.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
diff --git a/index/epocxy.mk b/index/epocxy.mk
deleted file mode 100644
index 11cbd7f..0000000
--- a/index/epocxy.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
diff --git a/index/epubnub.mk b/index/epubnub.mk
deleted file mode 100644
index 11e0a12..0000000
--- a/index/epubnub.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
diff --git a/index/eqm.mk b/index/eqm.mk
deleted file mode 100644
index 138966e..0000000
--- a/index/eqm.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
diff --git a/index/eredis.mk b/index/eredis.mk
deleted file mode 100644
index 6e7a430..0000000
--- a/index/eredis.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
diff --git a/index/eredis_pool.mk b/index/eredis_pool.mk
deleted file mode 100644
index d10c6fc..0000000
--- a/index/eredis_pool.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
diff --git a/index/erl_streams.mk b/index/erl_streams.mk
deleted file mode 100644
index baebaed..0000000
--- a/index/erl_streams.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
diff --git a/index/erlang_cep.mk b/index/erlang_cep.mk
deleted file mode 100644
index 6d8f60f..0000000
--- a/index/erlang_cep.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
diff --git a/index/erlang_js.mk b/index/erlang_js.mk
deleted file mode 100644
index f6953cd..0000000
--- a/index/erlang_js.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
diff --git a/index/erlang_localtime.mk b/index/erlang_localtime.mk
deleted file mode 100644
index 93e2398..0000000
--- a/index/erlang_localtime.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
diff --git a/index/erlang_smtp.mk b/index/erlang_smtp.mk
deleted file mode 100644
index 2d5c0fe..0000000
--- a/index/erlang_smtp.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
diff --git a/index/erlang_term.mk b/index/erlang_term.mk
deleted file mode 100644
index c93b92d..0000000
--- a/index/erlang_term.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
diff --git a/index/erlastic_search.mk b/index/erlastic_search.mk
deleted file mode 100644
index 4d7313f..0000000
--- a/index/erlastic_search.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
diff --git a/index/erlasticsearch.mk b/index/erlasticsearch.mk
deleted file mode 100644
index 9f72555..0000000
--- a/index/erlasticsearch.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
diff --git a/index/erlbrake.mk b/index/erlbrake.mk
deleted file mode 100644
index 090b57c..0000000
--- a/index/erlbrake.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
diff --git a/index/erlcloud.mk b/index/erlcloud.mk
deleted file mode 100644
index 91c4ef3..0000000
--- a/index/erlcloud.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
diff --git a/index/erlcron.mk b/index/erlcron.mk
deleted file mode 100644
index 8495a65..0000000
--- a/index/erlcron.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
diff --git a/index/erldb.mk b/index/erldb.mk
deleted file mode 100644
index 3f55506..0000000
--- a/index/erldb.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
diff --git a/index/erldis.mk b/index/erldis.mk
deleted file mode 100644
index f638699..0000000
--- a/index/erldis.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
diff --git a/index/erldns.mk b/index/erldns.mk
deleted file mode 100644
index d5ab604..0000000
--- a/index/erldns.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
diff --git a/index/erldocker.mk b/index/erldocker.mk
deleted file mode 100644
index d49c47d..0000000
--- a/index/erldocker.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
diff --git a/index/erlfsmon.mk b/index/erlfsmon.mk
deleted file mode 100644
index eb13fc2..0000000
--- a/index/erlfsmon.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
diff --git a/index/erlgit.mk b/index/erlgit.mk
deleted file mode 100644
index 0e6edcf..0000000
--- a/index/erlgit.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
diff --git a/index/erlguten.mk b/index/erlguten.mk
deleted file mode 100644
index ca3bdfc..0000000
--- a/index/erlguten.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
diff --git a/index/erlmc.mk b/index/erlmc.mk
deleted file mode 100644
index 79ea268..0000000
--- a/index/erlmc.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
diff --git a/index/erlmongo.mk b/index/erlmongo.mk
deleted file mode 100644
index dc8da80..0000000
--- a/index/erlmongo.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
diff --git a/index/erlog.mk b/index/erlog.mk
deleted file mode 100644
index c605fd3..0000000
--- a/index/erlog.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
diff --git a/index/erlpass.mk b/index/erlpass.mk
deleted file mode 100644
index 1c58700..0000000
--- a/index/erlpass.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
diff --git a/index/erlport.mk b/index/erlport.mk
deleted file mode 100644
index 81fd3d0..0000000
--- a/index/erlport.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
diff --git a/index/erlsh.mk b/index/erlsh.mk
deleted file mode 100644
index 28bdc75..0000000
--- a/index/erlsh.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
diff --git a/index/erlsha2.mk b/index/erlsha2.mk
deleted file mode 100644
index 7f39a96..0000000
--- a/index/erlsha2.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
diff --git a/index/erlsom.mk b/index/erlsom.mk
deleted file mode 100644
index 0cf900c..0000000
--- a/index/erlsom.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
diff --git a/index/erlubi.mk b/index/erlubi.mk
deleted file mode 100644
index c896e9f..0000000
--- a/index/erlubi.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
diff --git a/index/erlvolt.mk b/index/erlvolt.mk
deleted file mode 100644
index f0edda3..0000000
--- a/index/erlvolt.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
diff --git a/index/erlware_commons.mk b/index/erlware_commons.mk
deleted file mode 100644
index 4ef76a5..0000000
--- a/index/erlware_commons.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
diff --git a/index/errd.mk b/index/errd.mk
deleted file mode 100644
index e432405..0000000
--- a/index/errd.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
diff --git a/index/erserve.mk b/index/erserve.mk
deleted file mode 100644
index cdbc84a..0000000
--- a/index/erserve.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
diff --git a/index/erwa.mk b/index/erwa.mk
deleted file mode 100644
index f865916..0000000
--- a/index/erwa.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = master
diff --git a/index/escalus.mk b/index/escalus.mk
deleted file mode 100644
index bac1253..0000000
--- a/index/escalus.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += escalus
-pkg_escalus_name = escalus
-pkg_escalus_description = An XMPP client library in Erlang for conveniently testing XMPP servers
-pkg_escalus_homepage = https://github.com/esl/escalus
-pkg_escalus_fetch = git
-pkg_escalus_repo = https://github.com/esl/escalus
-pkg_escalus_commit = master
diff --git a/index/esh_mk.mk b/index/esh_mk.mk
deleted file mode 100644
index 4bd44cf..0000000
--- a/index/esh_mk.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += esh_mk
-pkg_esh_mk_name = esh_mk
-pkg_esh_mk_description = esh template engine plugin for erlang.mk
-pkg_esh_mk_homepage = https://github.com/crownedgrouse/esh.mk
-pkg_esh_mk_fetch = git
-pkg_esh_mk_repo = https://github.com/crownedgrouse/esh.mk.git
-pkg_esh_mk_commit = master
diff --git a/index/espec.mk b/index/espec.mk
deleted file mode 100644
index 1f10ef1..0000000
--- a/index/espec.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
diff --git a/index/estatsd.mk b/index/estatsd.mk
deleted file mode 100644
index 478be09..0000000
--- a/index/estatsd.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
diff --git a/index/etap.mk b/index/etap.mk
deleted file mode 100644
index 10679ce..0000000
--- a/index/etap.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
diff --git a/index/etest.mk b/index/etest.mk
deleted file mode 100644
index 371a821..0000000
--- a/index/etest.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
diff --git a/index/etest_http.mk b/index/etest_http.mk
deleted file mode 100644
index d6065a1..0000000
--- a/index/etest_http.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
diff --git a/index/etoml.mk b/index/etoml.mk
deleted file mode 100644
index 75b8985..0000000
--- a/index/etoml.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
diff --git a/index/eunit.mk b/index/eunit.mk
deleted file mode 100644
index 958645f..0000000
--- a/index/eunit.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
diff --git a/index/eunit_formatters.mk b/index/eunit_formatters.mk
deleted file mode 100644
index 73cb28b..0000000
--- a/index/eunit_formatters.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
diff --git a/index/euthanasia.mk b/index/euthanasia.mk
deleted file mode 100644
index 7daf504..0000000
--- a/index/euthanasia.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
diff --git a/index/evum.mk b/index/evum.mk
deleted file mode 100644
index 0044582..0000000
--- a/index/evum.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
diff --git a/index/exec.mk b/index/exec.mk
deleted file mode 100644
index 2a05c42..0000000
--- a/index/exec.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += exec
-pkg_exec_name = erlexec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
diff --git a/index/exml.mk b/index/exml.mk
deleted file mode 100644
index d43a640..0000000
--- a/index/exml.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
diff --git a/index/exometer.mk b/index/exometer.mk
deleted file mode 100644
index a579d97..0000000
--- a/index/exometer.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = master
diff --git a/index/exs1024.mk b/index/exs1024.mk
deleted file mode 100644
index 1bc33b7..0000000
--- a/index/exs1024.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
diff --git a/index/exs64.mk b/index/exs64.mk
deleted file mode 100644
index 3df0de5..0000000
--- a/index/exs64.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
diff --git a/index/exsplus116.mk b/index/exsplus116.mk
deleted file mode 100644
index db6b52e..0000000
--- a/index/exsplus116.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
diff --git a/index/exsplus128.mk b/index/exsplus128.mk
deleted file mode 100644
index a87a89c..0000000
--- a/index/exsplus128.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
diff --git a/index/ezmq.mk b/index/ezmq.mk
deleted file mode 100644
index 9d895b4..0000000
--- a/index/ezmq.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
diff --git a/index/ezmtp.mk b/index/ezmtp.mk
deleted file mode 100644
index bbcbbc1..0000000
--- a/index/ezmtp.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
diff --git a/index/fast_disk_log.mk b/index/fast_disk_log.mk
deleted file mode 100644
index 26f63ca..0000000
--- a/index/fast_disk_log.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
diff --git a/index/feeder.mk b/index/feeder.mk
deleted file mode 100644
index 38cc4bc..0000000
--- a/index/feeder.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = master
diff --git a/index/find_crate.mk b/index/find_crate.mk
deleted file mode 100644
index 0d2a851..0000000
--- a/index/find_crate.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += find_crate
-pkg_find_crate_name = find_crate
-pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
-pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
-pkg_find_crate_fetch = git
-pkg_find_crate_repo = https://github.com/goertzenator/find_crate
-pkg_find_crate_commit = master
diff --git a/index/fix.mk b/index/fix.mk
deleted file mode 100644
index 332067d..0000000
--- a/index/fix.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
diff --git a/index/flower.mk b/index/flower.mk
deleted file mode 100644
index 4ba08c5..0000000
--- a/index/flower.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
diff --git a/index/fn.mk b/index/fn.mk
deleted file mode 100644
index a937cb5..0000000
--- a/index/fn.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
diff --git a/index/folsom.mk b/index/folsom.mk
deleted file mode 100644
index 487b22c..0000000
--- a/index/folsom.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
diff --git a/index/folsom_cowboy.mk b/index/folsom_cowboy.mk
deleted file mode 100644
index c0af8b1..0000000
--- a/index/folsom_cowboy.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
diff --git a/index/folsomite.mk b/index/folsomite.mk
deleted file mode 100644
index 051f25b..0000000
--- a/index/folsomite.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
diff --git a/index/fs.mk b/index/fs.mk
deleted file mode 100644
index 2316c28..0000000
--- a/index/fs.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
diff --git a/index/fuse.mk b/index/fuse.mk
deleted file mode 100644
index 2841c34..0000000
--- a/index/fuse.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
diff --git a/index/gcm.mk b/index/gcm.mk
deleted file mode 100644
index 6831fe5..0000000
--- a/index/gcm.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
diff --git a/index/gcprof.mk b/index/gcprof.mk
deleted file mode 100644
index ac5de76..0000000
--- a/index/gcprof.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
diff --git a/index/geas.mk b/index/geas.mk
deleted file mode 100644
index e3d5ad8..0000000
--- a/index/geas.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
diff --git a/index/geef.mk b/index/geef.mk
deleted file mode 100644
index af38dbc..0000000
--- a/index/geef.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
diff --git a/index/gen_coap.mk b/index/gen_coap.mk
deleted file mode 100644
index 58c9799..0000000
--- a/index/gen_coap.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gen_coap
-pkg_gen_coap_name = gen_coap
-pkg_gen_coap_description = Generic Erlang CoAP Client/Server
-pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
-pkg_gen_coap_fetch = git
-pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
-pkg_gen_coap_commit = master
diff --git a/index/gen_cycle.mk b/index/gen_cycle.mk
deleted file mode 100644
index 2a5d91f..0000000
--- a/index/gen_cycle.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
diff --git a/index/gen_icmp.mk b/index/gen_icmp.mk
deleted file mode 100644
index c2a2225..0000000
--- a/index/gen_icmp.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
diff --git a/index/gen_leader.mk b/index/gen_leader.mk
deleted file mode 100644
index 9eb4954..0000000
--- a/index/gen_leader.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gen_leader
-pkg_gen_leader_name = gen_leader
-pkg_gen_leader_description = leader election behavior
-pkg_gen_leader_homepage = https://github.com/garret-smith/gen_leader_revival
-pkg_gen_leader_fetch = git
-pkg_gen_leader_repo = https://github.com/garret-smith/gen_leader_revival
-pkg_gen_leader_commit = master
diff --git a/index/gen_nb_server.mk b/index/gen_nb_server.mk
deleted file mode 100644
index 8746b8f..0000000
--- a/index/gen_nb_server.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
diff --git a/index/gen_paxos.mk b/index/gen_paxos.mk
deleted file mode 100644
index 94d5803..0000000
--- a/index/gen_paxos.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
diff --git a/index/gen_rpc.mk b/index/gen_rpc.mk
deleted file mode 100644
index d5b07b4..0000000
--- a/index/gen_rpc.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gen_rpc
-pkg_gen_rpc_name = gen_rpc
-pkg_gen_rpc_description = A scalable RPC library for Erlang-VM based languages
-pkg_gen_rpc_homepage = https://github.com/priestjim/gen_rpc.git
-pkg_gen_rpc_fetch = git
-pkg_gen_rpc_repo = https://github.com/priestjim/gen_rpc.git
-pkg_gen_rpc_commit = master
diff --git a/index/gen_smtp.mk b/index/gen_smtp.mk
deleted file mode 100644
index a3e3196..0000000
--- a/index/gen_smtp.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
diff --git a/index/gen_tracker.mk b/index/gen_tracker.mk
deleted file mode 100644
index e9c80bd..0000000
--- a/index/gen_tracker.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
diff --git a/index/gen_unix.mk b/index/gen_unix.mk
deleted file mode 100644
index d61a85c..0000000
--- a/index/gen_unix.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
diff --git a/index/geode.mk b/index/geode.mk
deleted file mode 100644
index 4eaec34..0000000
--- a/index/geode.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += geode
-pkg_geode_name = geode
-pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
-pkg_geode_homepage = https://github.com/bradfordw/geode
-pkg_geode_fetch = git
-pkg_geode_repo = https://github.com/bradfordw/geode
-pkg_geode_commit = master
diff --git a/index/getopt.mk b/index/getopt.mk
deleted file mode 100644
index 0419e13..0000000
--- a/index/getopt.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
diff --git a/index/gettext.mk b/index/gettext.mk
deleted file mode 100644
index 1273f50..0000000
--- a/index/gettext.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
diff --git a/index/giallo.mk b/index/giallo.mk
deleted file mode 100644
index 6fbd1b6..0000000
--- a/index/giallo.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
diff --git a/index/gin.mk b/index/gin.mk
deleted file mode 100644
index ace9404..0000000
--- a/index/gin.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards and for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
diff --git a/index/gitty.mk b/index/gitty.mk
deleted file mode 100644
index 6a7e6ae..0000000
--- a/index/gitty.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
diff --git a/index/gold_fever.mk b/index/gold_fever.mk
deleted file mode 100644
index c3d47fd..0000000
--- a/index/gold_fever.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
diff --git a/index/gproc.mk b/index/gproc.mk
deleted file mode 100644
index 8ca84ae..0000000
--- a/index/gproc.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
diff --git a/index/grapherl.mk b/index/grapherl.mk
deleted file mode 100644
index cf1fcc9..0000000
--- a/index/grapherl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
diff --git a/index/grpc.mk b/index/grpc.mk
deleted file mode 100644
index 1bb3fd7..0000000
--- a/index/grpc.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += grpc
-pkg_grpc_name = grpc
-pkg_grpc_description = gRPC server in Erlang
-pkg_grpc_homepage = https://github.com/Bluehouse-Technology/grpc
-pkg_grpc_fetch = git
-pkg_grpc_repo = https://github.com/Bluehouse-Technology/grpc
-pkg_grpc_commit = master
diff --git a/index/grpc_client.mk b/index/grpc_client.mk
deleted file mode 100644
index 613fae1..0000000
--- a/index/grpc_client.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += grpc_client
-pkg_grpc_client_name = grpc_client
-pkg_grpc_client_description = gRPC client in Erlang
-pkg_grpc_client_homepage = https://github.com/Bluehouse-Technology/grpc_client
-pkg_grpc_client_fetch = git
-pkg_grpc_client_repo = https://github.com/Bluehouse-Technology/grpc_client
-pkg_grpc_client_commit = master
diff --git a/index/gut.mk b/index/gut.mk
deleted file mode 100644
index 1873c8e..0000000
--- a/index/gut.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
diff --git a/index/hackney.mk b/index/hackney.mk
deleted file mode 100644
index 8d89604..0000000
--- a/index/hackney.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
diff --git a/index/hamcrest.mk b/index/hamcrest.mk
deleted file mode 100644
index d87e5db..0000000
--- a/index/hamcrest.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
diff --git a/index/hanoidb.mk b/index/hanoidb.mk
deleted file mode 100644
index 8fd0f73..0000000
--- a/index/hanoidb.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
diff --git a/index/hex_core.mk b/index/hex_core.mk
new file mode 100644
index 0000000..741c7dc
--- /dev/null
+++ b/index/hex_core.mk
@@ -0,0 +1,8 @@
+PACKAGES += hex_core
+pkg_hex_core_name = hex_core
+pkg_hex_core_description = Reference implementation of Hex specifications
+pkg_hex_core_homepage = https://github.com/hexpm/hex_core
+pkg_hex_core_fetch = git
+HEX_CORE_GIT ?= https://github.com/hexpm/hex_core
+pkg_hex_core_repo = $(HEX_CORE_GIT)
+pkg_hex_core_commit = e57b4fb15cde710b3ae09b1d18f148f6999a63cc
diff --git a/index/hottub.mk b/index/hottub.mk
deleted file mode 100644
index 18ee120..0000000
--- a/index/hottub.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
diff --git a/index/hpack.mk b/index/hpack.mk
deleted file mode 100644
index 00c330c..0000000
--- a/index/hpack.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
diff --git a/index/hyper.mk b/index/hyper.mk
deleted file mode 100644
index d165cff..0000000
--- a/index/hyper.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
diff --git a/index/i18n.mk b/index/i18n.mk
deleted file mode 100644
index f3f2c89..0000000
--- a/index/i18n.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += i18n
-pkg_i18n_name = i18n
-pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
-pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
-pkg_i18n_fetch = git
-pkg_i18n_repo = https://github.com/erlang-unicode/i18n
-pkg_i18n_commit = master
diff --git a/index/ibrowse.mk b/index/ibrowse.mk
deleted file mode 100644
index fe7de42..0000000
--- a/index/ibrowse.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = master
diff --git a/index/idna.mk b/index/idna.mk
deleted file mode 100644
index 1cf88c0..0000000
--- a/index/idna.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += idna
-pkg_idna_name = idna
-pkg_idna_description = Erlang IDNA lib
-pkg_idna_homepage = https://github.com/benoitc/erlang-idna
-pkg_idna_fetch = git
-pkg_idna_repo = https://github.com/benoitc/erlang-idna
-pkg_idna_commit = master
diff --git a/index/ierlang.mk b/index/ierlang.mk
deleted file mode 100644
index a2143eb..0000000
--- a/index/ierlang.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
diff --git a/index/iota.mk b/index/iota.mk
deleted file mode 100644
index cb8e339..0000000
--- a/index/iota.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
diff --git a/index/irc_lib.mk b/index/irc_lib.mk
deleted file mode 100644
index 3bf44b1..0000000
--- a/index/irc_lib.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
diff --git a/index/ircd.mk b/index/ircd.mk
deleted file mode 100644
index 2e31fdf..0000000
--- a/index/ircd.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
diff --git a/index/iris.mk b/index/iris.mk
deleted file mode 100644
index 810b255..0000000
--- a/index/iris.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
diff --git a/index/iso8601.mk b/index/iso8601.mk
deleted file mode 100644
index a1abe1b..0000000
--- a/index/iso8601.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
diff --git a/index/jamdb_sybase.mk b/index/jamdb_sybase.mk
deleted file mode 100644
index 54230f3..0000000
--- a/index/jamdb_sybase.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = master
diff --git a/index/jerg.mk b/index/jerg.mk
deleted file mode 100644
index 1022457..0000000
--- a/index/jerg.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
diff --git a/index/jesse.mk b/index/jesse.mk
deleted file mode 100644
index b36b699..0000000
--- a/index/jesse.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/for-GET/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/for-GET/jesse
-pkg_jesse_commit = master
diff --git a/index/jiffy.mk b/index/jiffy.mk
deleted file mode 100644
index 95aea1d..0000000
--- a/index/jiffy.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
diff --git a/index/jiffy_v.mk b/index/jiffy_v.mk
deleted file mode 100644
index ae25b4b..0000000
--- a/index/jiffy_v.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = master
diff --git a/index/jobs.mk b/index/jobs.mk
deleted file mode 100644
index ebe6e74..0000000
--- a/index/jobs.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = master
diff --git a/index/joxa.mk b/index/joxa.mk
deleted file mode 100644
index e7871fb..0000000
--- a/index/joxa.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
diff --git a/index/json.mk b/index/json.mk
deleted file mode 100644
index 0919367..0000000
--- a/index/json.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
diff --git a/index/json_rec.mk b/index/json_rec.mk
deleted file mode 100644
index 02619e0..0000000
--- a/index/json_rec.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
diff --git a/index/jsone.mk b/index/jsone.mk
deleted file mode 100644
index cf7378e..0000000
--- a/index/jsone.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += jsone
-pkg_jsone_name = jsone
-pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
-pkg_jsone_homepage = https://github.com/sile/jsone.git
-pkg_jsone_fetch = git
-pkg_jsone_repo = https://github.com/sile/jsone.git
-pkg_jsone_commit = master
diff --git a/index/jsonerl.mk b/index/jsonerl.mk
deleted file mode 100644
index 609340c..0000000
--- a/index/jsonerl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
diff --git a/index/jsonpath.mk b/index/jsonpath.mk
deleted file mode 100644
index 0eb069c..0000000
--- a/index/jsonpath.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
diff --git a/index/jsonx.mk b/index/jsonx.mk
deleted file mode 100644
index ddc0373..0000000
--- a/index/jsonx.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
diff --git a/index/jsx.mk b/index/jsx.mk
deleted file mode 100644
index f40f291..0000000
--- a/index/jsx.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = main
diff --git a/index/kafka.mk b/index/kafka.mk
deleted file mode 100644
index 0e69514..0000000
--- a/index/kafka.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
diff --git a/index/kafka_protocol.mk b/index/kafka_protocol.mk
deleted file mode 100644
index 8a9fb2f..0000000
--- a/index/kafka_protocol.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += kafka_protocol
-pkg_kafka_protocol_name = kafka_protocol
-pkg_kafka_protocol_description = Kafka protocol Erlang library
-pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
-pkg_kafka_protocol_fetch = git
-pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
-pkg_kafka_protocol_commit = master
diff --git a/index/kai.mk b/index/kai.mk
deleted file mode 100644
index ce34274..0000000
--- a/index/kai.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
diff --git a/index/katja.mk b/index/katja.mk
deleted file mode 100644
index c602db7..0000000
--- a/index/katja.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
diff --git a/index/kdht.mk b/index/kdht.mk
deleted file mode 100644
index 97819a0..0000000
--- a/index/kdht.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
diff --git a/index/key2value.mk b/index/key2value.mk
deleted file mode 100644
index 812bda8..0000000
--- a/index/key2value.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
diff --git a/index/keys1value.mk b/index/keys1value.mk
deleted file mode 100644
index f88ec2a..0000000
--- a/index/keys1value.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
diff --git a/index/kinetic.mk b/index/kinetic.mk
deleted file mode 100644
index 869bc4f..0000000
--- a/index/kinetic.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
diff --git a/index/kjell.mk b/index/kjell.mk
deleted file mode 100644
index 62d6473..0000000
--- a/index/kjell.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
diff --git a/index/kraken.mk b/index/kraken.mk
deleted file mode 100644
index faebc3a..0000000
--- a/index/kraken.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
diff --git a/index/kucumberl.mk b/index/kucumberl.mk
deleted file mode 100644
index 8c68c06..0000000
--- a/index/kucumberl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
diff --git a/index/kvc.mk b/index/kvc.mk
deleted file mode 100644
index 42d7457..0000000
--- a/index/kvc.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
diff --git a/index/kvlists.mk b/index/kvlists.mk
deleted file mode 100644
index fa00ab9..0000000
--- a/index/kvlists.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
diff --git a/index/kvs.mk b/index/kvs.mk
deleted file mode 100644
index 3d35aa6..0000000
--- a/index/kvs.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
diff --git a/index/lager.mk b/index/lager.mk
deleted file mode 100644
index da0b245..0000000
--- a/index/lager.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/erlang-lager/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/erlang-lager/lager
-pkg_lager_commit = master
diff --git a/index/lager_amqp_backend.mk b/index/lager_amqp_backend.mk
deleted file mode 100644
index a991688..0000000
--- a/index/lager_amqp_backend.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
diff --git a/index/lager_syslog.mk b/index/lager_syslog.mk
deleted file mode 100644
index bef239b..0000000
--- a/index/lager_syslog.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/erlang-lager/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/erlang-lager/lager_syslog
-pkg_lager_syslog_commit = master
diff --git a/index/lambdapad.mk b/index/lambdapad.mk
deleted file mode 100644
index aa28bcc..0000000
--- a/index/lambdapad.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
diff --git a/index/lasp.mk b/index/lasp.mk
deleted file mode 100644
index 8f8b4d8..0000000
--- a/index/lasp.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
diff --git a/index/lasse.mk b/index/lasse.mk
deleted file mode 100644
index e5410b3..0000000
--- a/index/lasse.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = master
diff --git a/index/ldap.mk b/index/ldap.mk
deleted file mode 100644
index 9492ccb..0000000
--- a/index/ldap.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
diff --git a/index/lethink.mk b/index/lethink.mk
deleted file mode 100644
index 7737fd1..0000000
--- a/index/lethink.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
diff --git a/index/lfe.mk b/index/lfe.mk
deleted file mode 100644
index 21d87b9..0000000
--- a/index/lfe.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
diff --git a/index/ling.mk b/index/ling.mk
deleted file mode 100644
index 51a2a2e..0000000
--- a/index/ling.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
diff --git a/index/live.mk b/index/live.mk
deleted file mode 100644
index 06d35f3..0000000
--- a/index/live.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
diff --git a/index/lmq.mk b/index/lmq.mk
deleted file mode 100644
index 8909bdd..0000000
--- a/index/lmq.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
diff --git a/index/locker.mk b/index/locker.mk
deleted file mode 100644
index eaef798..0000000
--- a/index/locker.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
diff --git a/index/locks.mk b/index/locks.mk
deleted file mode 100644
index 6451312..0000000
--- a/index/locks.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
diff --git a/index/log4erl.mk b/index/log4erl.mk
deleted file mode 100644
index c567d59..0000000
--- a/index/log4erl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
diff --git a/index/lol.mk b/index/lol.mk
deleted file mode 100644
index 89c2e33..0000000
--- a/index/lol.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
diff --git a/index/lucid.mk b/index/lucid.mk
deleted file mode 100644
index 14d6598..0000000
--- a/index/lucid.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
diff --git a/index/luerl.mk b/index/luerl.mk
deleted file mode 100644
index 2e32be2..0000000
--- a/index/luerl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
diff --git a/index/luwak.mk b/index/luwak.mk
deleted file mode 100644
index 22a4cbe..0000000
--- a/index/luwak.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
diff --git a/index/lux.mk b/index/lux.mk
deleted file mode 100644
index ae08293..0000000
--- a/index/lux.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
diff --git a/index/machi.mk b/index/machi.mk
deleted file mode 100644
index d42030e..0000000
--- a/index/machi.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
diff --git a/index/mad.mk b/index/mad.mk
deleted file mode 100644
index 5134c03..0000000
--- a/index/mad.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
diff --git a/index/marina.mk b/index/marina.mk
deleted file mode 100644
index b54f75a..0000000
--- a/index/marina.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
diff --git a/index/mavg.mk b/index/mavg.mk
deleted file mode 100644
index ce1869e..0000000
--- a/index/mavg.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
diff --git a/index/mc_erl.mk b/index/mc_erl.mk
deleted file mode 100644
index 400e42f..0000000
--- a/index/mc_erl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
diff --git a/index/mcd.mk b/index/mcd.mk
deleted file mode 100644
index 0b52819..0000000
--- a/index/mcd.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
diff --git a/index/mcerlang.mk b/index/mcerlang.mk
deleted file mode 100644
index 195767a..0000000
--- a/index/mcerlang.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
diff --git a/index/meck.mk b/index/meck.mk
deleted file mode 100644
index cb470c6..0000000
--- a/index/meck.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
diff --git a/index/mekao.mk b/index/mekao.mk
deleted file mode 100644
index 70bf74c..0000000
--- a/index/mekao.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
diff --git a/index/memo.mk b/index/memo.mk
deleted file mode 100644
index e41c84a..0000000
--- a/index/memo.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
diff --git a/index/merge_index.mk b/index/merge_index.mk
deleted file mode 100644
index d1e6d93..0000000
--- a/index/merge_index.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
diff --git a/index/merl.mk b/index/merl.mk
deleted file mode 100644
index 254069f..0000000
--- a/index/merl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
diff --git a/index/mimerl.mk b/index/mimerl.mk
deleted file mode 100644
index 6a613d1..0000000
--- a/index/mimerl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mimerl
-pkg_mimerl_name = mimerl
-pkg_mimerl_description = library to handle mimetypes
-pkg_mimerl_homepage = https://github.com/benoitc/mimerl
-pkg_mimerl_fetch = git
-pkg_mimerl_repo = https://github.com/benoitc/mimerl
-pkg_mimerl_commit = master
diff --git a/index/mimetypes.mk b/index/mimetypes.mk
deleted file mode 100644
index 4f53275..0000000
--- a/index/mimetypes.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
diff --git a/index/mixer.mk b/index/mixer.mk
deleted file mode 100644
index 8a84c3a..0000000
--- a/index/mixer.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
diff --git a/index/mochiweb.mk b/index/mochiweb.mk
deleted file mode 100644
index 15df91e..0000000
--- a/index/mochiweb.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
diff --git a/index/mochiweb_xpath.mk b/index/mochiweb_xpath.mk
deleted file mode 100644
index 4f13807..0000000
--- a/index/mochiweb_xpath.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
diff --git a/index/mockgyver.mk b/index/mockgyver.mk
deleted file mode 100644
index 309c4dd..0000000
--- a/index/mockgyver.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
diff --git a/index/modlib.mk b/index/modlib.mk
deleted file mode 100644
index d6cb247..0000000
--- a/index/modlib.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
diff --git a/index/mongodb.mk b/index/mongodb.mk
deleted file mode 100644
index 247bb5d..0000000
--- a/index/mongodb.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
diff --git a/index/mongooseim.mk b/index/mongooseim.mk
deleted file mode 100644
index a959807..0000000
--- a/index/mongooseim.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
diff --git a/index/moyo.mk b/index/moyo.mk
deleted file mode 100644
index a8653ae..0000000
--- a/index/moyo.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
diff --git a/index/msgpack.mk b/index/msgpack.mk
deleted file mode 100644
index e9b0145..0000000
--- a/index/msgpack.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
diff --git a/index/mu2.mk b/index/mu2.mk
deleted file mode 100644
index 6b87504..0000000
--- a/index/mu2.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
diff --git a/index/mustache.mk b/index/mustache.mk
deleted file mode 100644
index 444fcc6..0000000
--- a/index/mustache.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
diff --git a/index/myproto.mk b/index/myproto.mk
deleted file mode 100644
index 24d9f85..0000000
--- a/index/myproto.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
diff --git a/index/mysql.mk b/index/mysql.mk
deleted file mode 100644
index 2e31771..0000000
--- a/index/mysql.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = MySQL client library for Erlang/OTP
-pkg_mysql_homepage = https://github.com/mysql-otp/mysql-otp
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/mysql-otp/mysql-otp
-pkg_mysql_commit = 1.7.0
diff --git a/index/n2o.mk b/index/n2o.mk
deleted file mode 100644
index 903dac5..0000000
--- a/index/n2o.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
diff --git a/index/nat_upnp.mk b/index/nat_upnp.mk
deleted file mode 100644
index a336953..0000000
--- a/index/nat_upnp.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
diff --git a/index/neo4j.mk b/index/neo4j.mk
deleted file mode 100644
index c65f6a1..0000000
--- a/index/neo4j.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
diff --git a/index/neotoma.mk b/index/neotoma.mk
deleted file mode 100644
index fcf0a7e..0000000
--- a/index/neotoma.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
diff --git a/index/newrelic.mk b/index/newrelic.mk
deleted file mode 100644
index 74274a1..0000000
--- a/index/newrelic.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
diff --git a/index/nifty.mk b/index/nifty.mk
deleted file mode 100644
index c5233ca..0000000
--- a/index/nifty.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
diff --git a/index/nitrogen_core.mk b/index/nitrogen_core.mk
deleted file mode 100644
index 42b1946..0000000
--- a/index/nitrogen_core.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
diff --git a/index/nkbase.mk b/index/nkbase.mk
deleted file mode 100644
index 68fa4a1..0000000
--- a/index/nkbase.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
diff --git a/index/nkdocker.mk b/index/nkdocker.mk
deleted file mode 100644
index 72a794c..0000000
--- a/index/nkdocker.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
diff --git a/index/nkpacket.mk b/index/nkpacket.mk
deleted file mode 100644
index 42e3ee6..0000000
--- a/index/nkpacket.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
diff --git a/index/nksip.mk b/index/nksip.mk
deleted file mode 100644
index b74ccfc..0000000
--- a/index/nksip.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
diff --git a/index/nodefinder.mk b/index/nodefinder.mk
deleted file mode 100644
index ee9d211..0000000
--- a/index/nodefinder.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
diff --git a/index/nprocreg.mk b/index/nprocreg.mk
deleted file mode 100644
index 6f25269..0000000
--- a/index/nprocreg.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
diff --git a/index/oauth.mk b/index/oauth.mk
deleted file mode 100644
index 93bdd9f..0000000
--- a/index/oauth.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
diff --git a/index/oauth2.mk b/index/oauth2.mk
deleted file mode 100644
index 6ac00bc..0000000
--- a/index/oauth2.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
diff --git a/index/observer_cli.mk b/index/observer_cli.mk
deleted file mode 100644
index 91ca0bc..0000000
--- a/index/observer_cli.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += observer_cli
-pkg_observer_cli_name = observer_cli
-pkg_observer_cli_description = Visualize Erlang/Elixir Nodes On The Command Line
-pkg_observer_cli_homepage = http://zhongwencool.github.io/observer_cli
-pkg_observer_cli_fetch = git
-pkg_observer_cli_repo = https://github.com/zhongwencool/observer_cli
-pkg_observer_cli_commit = master
diff --git a/index/octopus.mk b/index/octopus.mk
deleted file mode 100644
index 2aa288e..0000000
--- a/index/octopus.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = master
diff --git a/index/of_protocol.mk b/index/of_protocol.mk
deleted file mode 100644
index 671d7d7..0000000
--- a/index/of_protocol.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
diff --git a/index/opencouch.mk b/index/opencouch.mk
deleted file mode 100644
index 6bbc27f..0000000
--- a/index/opencouch.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
diff --git a/index/openflow.mk b/index/openflow.mk
deleted file mode 100644
index 9439d0d..0000000
--- a/index/openflow.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
diff --git a/index/openid.mk b/index/openid.mk
deleted file mode 100644
index 7370d48..0000000
--- a/index/openid.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
diff --git a/index/openpoker.mk b/index/openpoker.mk
deleted file mode 100644
index 54b76a3..0000000
--- a/index/openpoker.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
diff --git a/index/otpbp.mk b/index/otpbp.mk
deleted file mode 100644
index ff7717a..0000000
--- a/index/otpbp.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += otpbp
-pkg_otpbp_name = otpbp
-pkg_otpbp_description = Parse transformer for use new OTP functions in old Erlang/OTP releases (R15, R16, 17, 18, 19)
-pkg_otpbp_homepage = https://github.com/Ledest/otpbp
-pkg_otpbp_fetch = git
-pkg_otpbp_repo = https://github.com/Ledest/otpbp
-pkg_otpbp_commit = master
diff --git a/index/pal.mk b/index/pal.mk
deleted file mode 100644
index e69907a..0000000
--- a/index/pal.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
diff --git a/index/parse_trans.mk b/index/parse_trans.mk
deleted file mode 100644
index 2ac20f5..0000000
--- a/index/parse_trans.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
diff --git a/index/parsexml.mk b/index/parsexml.mk
deleted file mode 100644
index dd9a65c..0000000
--- a/index/parsexml.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
diff --git a/index/partisan.mk b/index/partisan.mk
deleted file mode 100644
index 13d6ae1..0000000
--- a/index/partisan.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += partisan
-pkg_partisan_name = partisan
-pkg_partisan_description = High-performance, high-scalability distributed computing with Erlang and Elixir.
-pkg_partisan_homepage = http://partisan.cloud
-pkg_partisan_fetch = git
-pkg_partisan_repo = https://github.com/lasp-lang/partisan
-pkg_partisan_commit = master
diff --git a/index/pegjs.mk b/index/pegjs.mk
deleted file mode 100644
index f507b8e..0000000
--- a/index/pegjs.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = master
diff --git a/index/percept2.mk b/index/percept2.mk
deleted file mode 100644
index 5c1cf0b..0000000
--- a/index/percept2.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
diff --git a/index/pgo.mk b/index/pgo.mk
deleted file mode 100644
index c7cd340..0000000
--- a/index/pgo.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += pgo
-pkg_pgo_name = pgo
-pkg_pgo_description = Erlang Postgres client and connection pool
-pkg_pgo_homepage = https://github.com/erleans/pgo.git
-pkg_pgo_fetch = git
-pkg_pgo_repo = https://github.com/erleans/pgo.git
-pkg_pgo_commit = master
diff --git a/index/pgsql.mk b/index/pgsql.mk
deleted file mode 100644
index cd69c91..0000000
--- a/index/pgsql.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
diff --git a/index/pkgx.mk b/index/pkgx.mk
deleted file mode 100644
index c38a6d9..0000000
--- a/index/pkgx.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
diff --git a/index/pkt.mk b/index/pkt.mk
deleted file mode 100644
index 9160ebd..0000000
--- a/index/pkt.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
diff --git a/index/plain_fsm.mk b/index/plain_fsm.mk
deleted file mode 100644
index b141add..0000000
--- a/index/plain_fsm.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
diff --git a/index/plumtree.mk b/index/plumtree.mk
deleted file mode 100644
index 435ad58..0000000
--- a/index/plumtree.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
diff --git a/index/pmod_transform.mk b/index/pmod_transform.mk
deleted file mode 100644
index c620936..0000000
--- a/index/pmod_transform.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
diff --git a/index/pobox.mk b/index/pobox.mk
deleted file mode 100644
index 94dff89..0000000
--- a/index/pobox.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
diff --git a/index/ponos.mk b/index/ponos.mk
deleted file mode 100644
index 6cbe8b9..0000000
--- a/index/ponos.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
diff --git a/index/poolboy.mk b/index/poolboy.mk
deleted file mode 100644
index 2534ae4..0000000
--- a/index/poolboy.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
diff --git a/index/pooler.mk b/index/pooler.mk
deleted file mode 100644
index c7cda50..0000000
--- a/index/pooler.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
diff --git a/index/pqueue.mk b/index/pqueue.mk
deleted file mode 100644
index 1338806..0000000
--- a/index/pqueue.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
diff --git a/index/procket.mk b/index/procket.mk
deleted file mode 100644
index 8b1197b..0000000
--- a/index/procket.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
diff --git a/index/prometheus.mk b/index/prometheus.mk
deleted file mode 100644
index d8e2592..0000000
--- a/index/prometheus.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += prometheus
-pkg_prometheus_name = prometheus
-pkg_prometheus_description = Prometheus.io client in Erlang
-pkg_prometheus_homepage = https://github.com/deadtrickster/prometheus.erl
-pkg_prometheus_fetch = git
-pkg_prometheus_repo = https://github.com/deadtrickster/prometheus.erl
-pkg_prometheus_commit = master
diff --git a/index/prop.mk b/index/prop.mk
deleted file mode 100644
index cb2a74f..0000000
--- a/index/prop.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
diff --git a/index/props.mk b/index/props.mk
deleted file mode 100644
index 55f8564..0000000
--- a/index/props.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
diff --git a/index/protobuffs.mk b/index/protobuffs.mk
deleted file mode 100644
index aa4934b..0000000
--- a/index/protobuffs.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
diff --git a/index/psycho.mk b/index/psycho.mk
deleted file mode 100644
index 232c6ae..0000000
--- a/index/psycho.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
diff --git a/index/purity.mk b/index/purity.mk
deleted file mode 100644
index 2472f68..0000000
--- a/index/purity.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
diff --git a/index/push_service.mk b/index/push_service.mk
deleted file mode 100644
index e5d5b4c..0000000
--- a/index/push_service.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
diff --git a/index/qdate.mk b/index/qdate.mk
deleted file mode 100644
index 679158a..0000000
--- a/index/qdate.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = master
diff --git a/index/qrcode.mk b/index/qrcode.mk
deleted file mode 100644
index c703552..0000000
--- a/index/qrcode.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
diff --git a/index/quest.mk b/index/quest.mk
deleted file mode 100644
index 5833197..0000000
--- a/index/quest.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
diff --git a/index/quickrand.mk b/index/quickrand.mk
deleted file mode 100644
index e65da71..0000000
--- a/index/quickrand.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
diff --git a/index/rabbit.mk b/index/rabbit.mk
deleted file mode 100644
index b9ca63d..0000000
--- a/index/rabbit.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
diff --git a/index/rabbit_exchange_type_riak.mk b/index/rabbit_exchange_type_riak.mk
deleted file mode 100644
index 5f7f277..0000000
--- a/index/rabbit_exchange_type_riak.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
diff --git a/index/rack.mk b/index/rack.mk
deleted file mode 100644
index b78e1da..0000000
--- a/index/rack.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
diff --git a/index/radierl.mk b/index/radierl.mk
deleted file mode 100644
index 61ffb38..0000000
--- a/index/radierl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
diff --git a/index/rafter.mk b/index/rafter.mk
deleted file mode 100644
index adc9080..0000000
--- a/index/rafter.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
diff --git a/index/ranch.mk b/index/ranch.mk
index f3c0f98..b4027a5 100644
--- a/index/ranch.mk
+++ b/index/ranch.mk
@@ -4,4 +4,4 @@ pkg_ranch_description = Socket acceptor pool for TCP protocols.
pkg_ranch_homepage = http://ninenines.eu
pkg_ranch_fetch = git
pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.2.1
+pkg_ranch_commit = master
diff --git a/index/rbeacon.mk b/index/rbeacon.mk
deleted file mode 100644
index b2cf45f..0000000
--- a/index/rbeacon.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
diff --git a/index/rebar.mk b/index/rebar.mk
deleted file mode 100644
index bd4096b..0000000
--- a/index/rebar.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
diff --git a/index/rebus.mk b/index/rebus.mk
deleted file mode 100644
index fe793b0..0000000
--- a/index/rebus.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
diff --git a/index/rec2json.mk b/index/rec2json.mk
deleted file mode 100644
index e5f12b1..0000000
--- a/index/rec2json.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
diff --git a/index/recon.mk b/index/recon.mk
deleted file mode 100644
index 4ea8587..0000000
--- a/index/recon.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = master
diff --git a/index/record_info.mk b/index/record_info.mk
deleted file mode 100644
index 28c0ff5..0000000
--- a/index/record_info.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
diff --git a/index/redgrid.mk b/index/redgrid.mk
deleted file mode 100644
index 7951538..0000000
--- a/index/redgrid.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
diff --git a/index/redo.mk b/index/redo.mk
deleted file mode 100644
index f7940df..0000000
--- a/index/redo.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
diff --git a/index/reload_mk.mk b/index/reload_mk.mk
deleted file mode 100644
index fc0ca2c..0000000
--- a/index/reload_mk.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
diff --git a/index/reltool_util.mk b/index/reltool_util.mk
deleted file mode 100644
index d85a940..0000000
--- a/index/reltool_util.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
diff --git a/index/relx.mk b/index/relx.mk
index b12fab7..d9614b0 100644
--- a/index/relx.mk
+++ b/index/relx.mk
@@ -4,4 +4,4 @@ pkg_relx_description = Sane, simple release creation for Erlang
pkg_relx_homepage = https://github.com/erlware/relx
pkg_relx_fetch = git
pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
+pkg_relx_commit = main
diff --git a/index/resource_discovery.mk b/index/resource_discovery.mk
deleted file mode 100644
index 424e23c..0000000
--- a/index/resource_discovery.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
diff --git a/index/restc.mk b/index/restc.mk
deleted file mode 100644
index 115ad8d..0000000
--- a/index/restc.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
diff --git a/index/rfc4627_jsonrpc.mk b/index/rfc4627_jsonrpc.mk
deleted file mode 100644
index a680ef0..0000000
--- a/index/rfc4627_jsonrpc.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
diff --git a/index/riak_control.mk b/index/riak_control.mk
deleted file mode 100644
index 49d11a3..0000000
--- a/index/riak_control.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
diff --git a/index/riak_core.mk b/index/riak_core.mk
deleted file mode 100644
index e3bfcfc..0000000
--- a/index/riak_core.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
diff --git a/index/riak_dt.mk b/index/riak_dt.mk
deleted file mode 100644
index f12a3a5..0000000
--- a/index/riak_dt.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
diff --git a/index/riak_ensemble.mk b/index/riak_ensemble.mk
deleted file mode 100644
index 24ad92b..0000000
--- a/index/riak_ensemble.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
diff --git a/index/riak_kv.mk b/index/riak_kv.mk
deleted file mode 100644
index 8b878de..0000000
--- a/index/riak_kv.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
diff --git a/index/riak_pg.mk b/index/riak_pg.mk
deleted file mode 100644
index 33a6465..0000000
--- a/index/riak_pg.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
diff --git a/index/riak_pipe.mk b/index/riak_pipe.mk
deleted file mode 100644
index 7b83b77..0000000
--- a/index/riak_pipe.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
diff --git a/index/riak_sysmon.mk b/index/riak_sysmon.mk
deleted file mode 100644
index 917edc5..0000000
--- a/index/riak_sysmon.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
diff --git a/index/riak_test.mk b/index/riak_test.mk
deleted file mode 100644
index fd7f006..0000000
--- a/index/riak_test.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
diff --git a/index/riakc.mk b/index/riakc.mk
deleted file mode 100644
index 0e9aa7e..0000000
--- a/index/riakc.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
diff --git a/index/riakhttpc.mk b/index/riakhttpc.mk
deleted file mode 100644
index b25d224..0000000
--- a/index/riakhttpc.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
diff --git a/index/riaknostic.mk b/index/riaknostic.mk
deleted file mode 100644
index 1151347..0000000
--- a/index/riaknostic.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
diff --git a/index/riakpool.mk b/index/riakpool.mk
deleted file mode 100644
index 98d2c5a..0000000
--- a/index/riakpool.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
diff --git a/index/rivus_cep.mk b/index/rivus_cep.mk
deleted file mode 100644
index ab139e1..0000000
--- a/index/rivus_cep.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
diff --git a/index/rlimit.mk b/index/rlimit.mk
deleted file mode 100644
index 2f9593e..0000000
--- a/index/rlimit.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
diff --git a/index/rust_mk.mk b/index/rust_mk.mk
deleted file mode 100644
index c0d0c37..0000000
--- a/index/rust_mk.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += rust_mk
-pkg_rust_mk_name = rust_mk
-pkg_rust_mk_description = Build Rust crates in an Erlang application
-pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
-pkg_rust_mk_fetch = git
-pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
-pkg_rust_mk_commit = master
diff --git a/index/safetyvalve.mk b/index/safetyvalve.mk
deleted file mode 100644
index bb1028d..0000000
--- a/index/safetyvalve.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
diff --git a/index/seestar.mk b/index/seestar.mk
deleted file mode 100644
index 8f3194b..0000000
--- a/index/seestar.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
diff --git a/index/service.mk b/index/service.mk
deleted file mode 100644
index 7fae811..0000000
--- a/index/service.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
diff --git a/index/setup.mk b/index/setup.mk
deleted file mode 100644
index 4daf281..0000000
--- a/index/setup.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
diff --git a/index/sext.mk b/index/sext.mk
deleted file mode 100644
index 9cbd872..0000000
--- a/index/sext.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
diff --git a/index/sfmt.mk b/index/sfmt.mk
deleted file mode 100644
index e6710be..0000000
--- a/index/sfmt.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
diff --git a/index/sgte.mk b/index/sgte.mk
deleted file mode 100644
index 0ef4cd9..0000000
--- a/index/sgte.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
diff --git a/index/sheriff.mk b/index/sheriff.mk
deleted file mode 100644
index 3753478..0000000
--- a/index/sheriff.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
diff --git a/index/shotgun.mk b/index/shotgun.mk
deleted file mode 100644
index 6ff7e51..0000000
--- a/index/shotgun.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = master
diff --git a/index/sidejob.mk b/index/sidejob.mk
deleted file mode 100644
index 53001f5..0000000
--- a/index/sidejob.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
diff --git a/index/sieve.mk b/index/sieve.mk
deleted file mode 100644
index b71bfbe..0000000
--- a/index/sieve.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
diff --git a/index/sighandler.mk b/index/sighandler.mk
deleted file mode 100644
index b4a252c..0000000
--- a/index/sighandler.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
diff --git a/index/simhash.mk b/index/simhash.mk
deleted file mode 100644
index fbfab42..0000000
--- a/index/simhash.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
diff --git a/index/simple_bridge.mk b/index/simple_bridge.mk
deleted file mode 100644
index fbdc209..0000000
--- a/index/simple_bridge.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
diff --git a/index/simple_oauth2.mk b/index/simple_oauth2.mk
deleted file mode 100644
index 1aa43ec..0000000
--- a/index/simple_oauth2.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
diff --git a/index/skel.mk b/index/skel.mk
deleted file mode 100644
index e31a131..0000000
--- a/index/skel.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
diff --git a/index/slack.mk b/index/slack.mk
deleted file mode 100644
index a38fe53..0000000
--- a/index/slack.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += slack
-pkg_slack_name = slack
-pkg_slack_description = Minimal slack notification OTP library.
-pkg_slack_homepage = https://github.com/DonBranson/slack
-pkg_slack_fetch = git
-pkg_slack_repo = https://github.com/DonBranson/slack.git
-pkg_slack_commit = master
diff --git a/index/smother.mk b/index/smother.mk
deleted file mode 100644
index 22175a0..0000000
--- a/index/smother.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
diff --git a/index/snappyer.mk b/index/snappyer.mk
deleted file mode 100644
index 061e544..0000000
--- a/index/snappyer.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += snappyer
-pkg_snappyer_name = snappyer
-pkg_snappyer_description = Snappy as nif for Erlang
-pkg_snappyer_homepage = https://github.com/zmstone/snappyer
-pkg_snappyer_fetch = git
-pkg_snappyer_repo = https://github.com/zmstone/snappyer.git
-pkg_snappyer_commit = master
diff --git a/index/social.mk b/index/social.mk
deleted file mode 100644
index 27dbc14..0000000
--- a/index/social.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
diff --git a/index/spapi_router.mk b/index/spapi_router.mk
deleted file mode 100644
index b8c2851..0000000
--- a/index/spapi_router.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
diff --git a/index/sqerl.mk b/index/sqerl.mk
deleted file mode 100644
index 66f8e56..0000000
--- a/index/sqerl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
diff --git a/index/srly.mk b/index/srly.mk
deleted file mode 100644
index 5385e1f..0000000
--- a/index/srly.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
diff --git a/index/sshrpc.mk b/index/sshrpc.mk
deleted file mode 100644
index 0ea7683..0000000
--- a/index/sshrpc.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
diff --git a/index/stable.mk b/index/stable.mk
deleted file mode 100644
index 63887b8..0000000
--- a/index/stable.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
diff --git a/index/statebox.mk b/index/statebox.mk
deleted file mode 100644
index cb80cde..0000000
--- a/index/statebox.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
diff --git a/index/statebox_riak.mk b/index/statebox_riak.mk
deleted file mode 100644
index 5298b81..0000000
--- a/index/statebox_riak.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
diff --git a/index/statman.mk b/index/statman.mk
deleted file mode 100644
index 8ac43c7..0000000
--- a/index/statman.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
diff --git a/index/statsderl.mk b/index/statsderl.mk
deleted file mode 100644
index 9e398fa..0000000
--- a/index/statsderl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
diff --git a/index/stdinout_pool.mk b/index/stdinout_pool.mk
deleted file mode 100644
index f3755b5..0000000
--- a/index/stdinout_pool.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
diff --git a/index/stockdb.mk b/index/stockdb.mk
deleted file mode 100644
index d850fcd..0000000
--- a/index/stockdb.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
diff --git a/index/stripe.mk b/index/stripe.mk
deleted file mode 100644
index a5fdbc5..0000000
--- a/index/stripe.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
diff --git a/index/subproc.mk b/index/subproc.mk
deleted file mode 100644
index a920bd1..0000000
--- a/index/subproc.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += subproc
-pkg_subproc_name = subproc
-pkg_subproc_description = unix subprocess manager with {active,once|false} modes
-pkg_subproc_homepage = http://dozzie.jarowit.net/trac/wiki/subproc
-pkg_subproc_fetch = git
-pkg_subproc_repo = https://github.com/dozzie/subproc
-pkg_subproc_commit = v0.1.0
diff --git a/index/supervisor3.mk b/index/supervisor3.mk
deleted file mode 100644
index 09356f6..0000000
--- a/index/supervisor3.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += supervisor3
-pkg_supervisor3_name = supervisor3
-pkg_supervisor3_description = OTP supervisor with additional strategies
-pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
-pkg_supervisor3_fetch = git
-pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
-pkg_supervisor3_commit = master
diff --git a/index/surrogate.mk b/index/surrogate.mk
deleted file mode 100644
index 71c8eac..0000000
--- a/index/surrogate.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
diff --git a/index/swab.mk b/index/swab.mk
deleted file mode 100644
index 8c99fd5..0000000
--- a/index/swab.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
diff --git a/index/swarm.mk b/index/swarm.mk
deleted file mode 100644
index 513da9a..0000000
--- a/index/swarm.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
diff --git a/index/switchboard.mk b/index/switchboard.mk
deleted file mode 100644
index 4124619..0000000
--- a/index/switchboard.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
diff --git a/index/syn.mk b/index/syn.mk
deleted file mode 100644
index f107eb9..0000000
--- a/index/syn.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
diff --git a/index/sync.mk b/index/sync.mk
deleted file mode 100644
index b7e91f7..0000000
--- a/index/sync.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
diff --git a/index/syntaxerl.mk b/index/syntaxerl.mk
deleted file mode 100644
index 37b0cdd..0000000
--- a/index/syntaxerl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
diff --git a/index/syslog.mk b/index/syslog.mk
deleted file mode 100644
index 1575138..0000000
--- a/index/syslog.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
diff --git a/index/taskforce.mk b/index/taskforce.mk
deleted file mode 100644
index b558e91..0000000
--- a/index/taskforce.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
diff --git a/index/tddreloader.mk b/index/tddreloader.mk
deleted file mode 100644
index 0ea4f26..0000000
--- a/index/tddreloader.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
diff --git a/index/tempo.mk b/index/tempo.mk
deleted file mode 100644
index 50ec46c..0000000
--- a/index/tempo.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
diff --git a/index/ticktick.mk b/index/ticktick.mk
deleted file mode 100644
index ad2856b..0000000
--- a/index/ticktick.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
diff --git a/index/tinymq.mk b/index/tinymq.mk
deleted file mode 100644
index da02a96..0000000
--- a/index/tinymq.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
diff --git a/index/tinymt.mk b/index/tinymt.mk
deleted file mode 100644
index 942e1a8..0000000
--- a/index/tinymt.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
diff --git a/index/tirerl.mk b/index/tirerl.mk
deleted file mode 100644
index 7504b9f..0000000
--- a/index/tirerl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
diff --git a/index/toml.mk b/index/toml.mk
deleted file mode 100644
index 1078610..0000000
--- a/index/toml.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += toml
-pkg_toml_name = toml
-pkg_toml_description = TOML (0.4.0) config parser
-pkg_toml_homepage = http://dozzie.jarowit.net/trac/wiki/TOML
-pkg_toml_fetch = git
-pkg_toml_repo = https://github.com/dozzie/toml
-pkg_toml_commit = v0.2.0
diff --git a/index/traffic_tools.mk b/index/traffic_tools.mk
deleted file mode 100644
index 2c99a10..0000000
--- a/index/traffic_tools.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
diff --git a/index/trails.mk b/index/trails.mk
deleted file mode 100644
index dec709f..0000000
--- a/index/trails.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
diff --git a/index/trane.mk b/index/trane.mk
deleted file mode 100644
index cc12cdb..0000000
--- a/index/trane.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
diff --git a/index/transit.mk b/index/transit.mk
deleted file mode 100644
index 09c0931..0000000
--- a/index/transit.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
diff --git a/index/trie.mk b/index/trie.mk
deleted file mode 100644
index 4a5fc2d..0000000
--- a/index/trie.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
diff --git a/index/tunctl.mk b/index/tunctl.mk
deleted file mode 100644
index e660f05..0000000
--- a/index/tunctl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
diff --git a/index/twerl.mk b/index/twerl.mk
deleted file mode 100644
index 31e8205..0000000
--- a/index/twerl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
diff --git a/index/twitter_erlang.mk b/index/twitter_erlang.mk
deleted file mode 100644
index abf34ba..0000000
--- a/index/twitter_erlang.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
diff --git a/index/ucol_nif.mk b/index/ucol_nif.mk
deleted file mode 100644
index 0dd1148..0000000
--- a/index/ucol_nif.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
diff --git a/index/unicorn.mk b/index/unicorn.mk
deleted file mode 100644
index 1465229..0000000
--- a/index/unicorn.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = master
diff --git a/index/unsplit.mk b/index/unsplit.mk
deleted file mode 100644
index c98ddc6..0000000
--- a/index/unsplit.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
diff --git a/index/uuid.mk b/index/uuid.mk
deleted file mode 100644
index baa88bf..0000000
--- a/index/uuid.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = master
diff --git a/index/ux.mk b/index/ux.mk
deleted file mode 100644
index 059d0d9..0000000
--- a/index/ux.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
diff --git a/index/vert.mk b/index/vert.mk
deleted file mode 100644
index dd8c0f1..0000000
--- a/index/vert.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
diff --git a/index/verx.mk b/index/verx.mk
deleted file mode 100644
index 1c058b2..0000000
--- a/index/verx.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
diff --git a/index/vmq_acl.mk b/index/vmq_acl.mk
deleted file mode 100644
index 98e4c5b..0000000
--- a/index/vmq_acl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
diff --git a/index/vmq_bridge.mk b/index/vmq_bridge.mk
deleted file mode 100644
index 8ad39d5..0000000
--- a/index/vmq_bridge.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
diff --git a/index/vmq_graphite.mk b/index/vmq_graphite.mk
deleted file mode 100644
index 9676536..0000000
--- a/index/vmq_graphite.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
diff --git a/index/vmq_passwd.mk b/index/vmq_passwd.mk
deleted file mode 100644
index e2f2e81..0000000
--- a/index/vmq_passwd.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
diff --git a/index/vmq_server.mk b/index/vmq_server.mk
deleted file mode 100644
index aac8e9d..0000000
--- a/index/vmq_server.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
diff --git a/index/vmq_snmp.mk b/index/vmq_snmp.mk
deleted file mode 100644
index e3a2ef9..0000000
--- a/index/vmq_snmp.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
diff --git a/index/vmq_systree.mk b/index/vmq_systree.mk
deleted file mode 100644
index db7ee93..0000000
--- a/index/vmq_systree.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
diff --git a/index/vmstats.mk b/index/vmstats.mk
deleted file mode 100644
index 60071d6..0000000
--- a/index/vmstats.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
diff --git a/index/walrus.mk b/index/walrus.mk
deleted file mode 100644
index 73dc0cb..0000000
--- a/index/walrus.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
diff --git a/index/webmachine.mk b/index/webmachine.mk
deleted file mode 100644
index 1900af8..0000000
--- a/index/webmachine.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
diff --git a/index/websocket_client.mk b/index/websocket_client.mk
deleted file mode 100644
index 61e886d..0000000
--- a/index/websocket_client.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
diff --git a/index/worker_pool.mk b/index/worker_pool.mk
deleted file mode 100644
index 11e47da..0000000
--- a/index/worker_pool.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = master
diff --git a/index/wrangler.mk b/index/wrangler.mk
deleted file mode 100644
index e6bd979..0000000
--- a/index/wrangler.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
diff --git a/index/wsock.mk b/index/wsock.mk
deleted file mode 100644
index bb5fec6..0000000
--- a/index/wsock.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
diff --git a/index/xhttpc.mk b/index/xhttpc.mk
deleted file mode 100644
index b48ae37..0000000
--- a/index/xhttpc.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
diff --git a/index/xref_runner.mk b/index/xref_runner.mk
deleted file mode 100644
index ded9a6f..0000000
--- a/index/xref_runner.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = master
diff --git a/index/yamerl.mk b/index/yamerl.mk
deleted file mode 100644
index 9c84231..0000000
--- a/index/yamerl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
diff --git a/index/yamler.mk b/index/yamler.mk
deleted file mode 100644
index 324f68a..0000000
--- a/index/yamler.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
diff --git a/index/yaws.mk b/index/yaws.mk
deleted file mode 100644
index 9173508..0000000
--- a/index/yaws.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
diff --git a/index/zab_engine.mk b/index/zab_engine.mk
deleted file mode 100644
index 838121e..0000000
--- a/index/zab_engine.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
diff --git a/index/zabbix_sender.mk b/index/zabbix_sender.mk
deleted file mode 100644
index 109f85b..0000000
--- a/index/zabbix_sender.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += zabbix_sender
-pkg_zabbix_sender_name = zabbix_sender
-pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
-pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
-pkg_zabbix_sender_fetch = git
-pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
-pkg_zabbix_sender_commit = master
diff --git a/index/zeta.mk b/index/zeta.mk
deleted file mode 100644
index 53e066a..0000000
--- a/index/zeta.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit = master
diff --git a/index/zippers.mk b/index/zippers.mk
deleted file mode 100644
index 66910c4..0000000
--- a/index/zippers.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
diff --git a/index/zlists.mk b/index/zlists.mk
deleted file mode 100644
index af56de3..0000000
--- a/index/zlists.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
diff --git a/index/zraft_lib.mk b/index/zraft_lib.mk
deleted file mode 100644
index 86298f5..0000000
--- a/index/zraft_lib.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
diff --git a/index/zucchini.mk b/index/zucchini.mk
deleted file mode 100644
index 9334f42..0000000
--- a/index/zucchini.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
diff --git a/packages.v2.tsv b/packages.v2.tsv
deleted file mode 100644
index 5edc657..0000000
--- a/packages.v2.tsv
+++ /dev/null
@@ -1,3 +0,0 @@
-Please update erlang.mk. :-)
-Run: make erlang-mk
-Enjoy!
diff --git a/pkg_add.sh b/pkg_add.sh
deleted file mode 100755
index c67b775..0000000
--- a/pkg_add.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/sh
-
-if [ -z "$1$2$3$4$5$6" ]
-then
- echo "Missing arguments" 1>&2
- exit 1
-fi
-
-T=`echo "$1" | grep "\." | wc -l `
-if [ "$T" -eq "1" ]
-then
- echo "Invalid dot character in name. Considere replace by an underscore." 1>&2
- exit 1
-fi
-
-PKG_FILE="index/$1.mk"
-CONTENTS="PACKAGES += $1
-pkg_$1_name = $1
-pkg_$1_description = $6
-pkg_$1_homepage = $5
-pkg_$1_fetch = $2
-pkg_$1_repo = $3
-pkg_$1_commit = $4
-"
-COMMIT="Add package $1 to the index"
-
-printf "$CONTENTS" > $PKG_FILE
-git add $PKG_FILE
-git commit -m "$COMMIT" $PKG_FILE
diff --git a/plugins/asciidoc.mk b/plugins/asciidoc.mk
index f4be7ff..778308b 100644
--- a/plugins/asciidoc.mk
+++ b/plugins/asciidoc.mk
@@ -57,8 +57,8 @@ try
})
end || F <- [$(shell echo $(addprefix $(comma)\",$(addsuffix \",$1)) | sed 's/^.//')]],
halt(0)
-catch C:E ->
- io:format("Exception ~p:~p~nStacktrace: ~p~n", [C, E, erlang:get_stacktrace()]),
+catch C:E$(if $V,:S) ->
+ io:format("Exception: ~p:~p~n$(if $V,Stacktrace: ~p~n)", [C, E$(if $V,$(comma) S)]),
halt(1)
end.
endef
diff --git a/plugins/bootstrap.mk b/plugins/bootstrap.mk
index 23dd238..5c3610a 100644
--- a/plugins/bootstrap.mk
+++ b/plugins/bootstrap.mk
@@ -17,385 +17,6 @@ help::
" new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
" list-templates List available templates"
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
- {description, ""},
- {vsn, "0.1.0"},
- {id, "git"},
- {modules, []},
- {registered, []},
- {applications, [
- kernel,
- stdlib
- ]},
- {mod, {$p_app, []}},
- {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
- {description, ""},
- {vsn, "0.1.0"},
- {id, "git"},
- {modules, []},
- {registered, []},
- {applications, [
- kernel,
- stdlib
- ]}
-]}.
-endef
-
-# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
-# separately during the actual bootstrap.
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.1.0
-$(if $(SP),
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-)
-endef
-
-define bs_apps_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.1.0
-$(if $(SP),
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-)
-# Make sure we know where the applications are located.
-ROOT_DIR ?= $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)
-APPS_DIR ?= ..
-DEPS_DIR ?= $(call core_relpath,$(DEPS_DIR),$(APPS_DIR)/app)
-
-include $$(ROOT_DIR)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
- $p_sup:start_link().
-
-stop(_State) ->
- ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p, sasl, runtime_tools]}.
-{extended_start_script, true}.
-{sys_config, "config/sys.config"}.
-{vm_args, "config/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
- supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
- Procs = [],
- {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
- gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
- {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
- {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
- {noreply, State}.
-
-handle_info(_Info, State) ->
- {noreply, State}.
-
-terminate(_Reason, _State) ->
- ok.
-
-code_change(_OldVsn, State, _Extra) ->
- {ok, State}.
-endef
-
-define tpl_module
--module($(n)).
--export([]).
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
- {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
- {ok, Req2} = cowboy_req:reply(200, Req),
- {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
- ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
- gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
- {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
- {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
- {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
- {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
- {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
- {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
- ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
- {ok, StateName, StateData}.
-endef
-
-define tpl_gen_statem
--module($(n)).
--behaviour(gen_statem).
-
-%% API.
--export([start_link/0]).
-
-%% gen_statem.
--export([callback_mode/0]).
--export([init/1]).
--export([state_name/3]).
--export([handle_event/4]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
- gen_statem:start_link(?MODULE, [], []).
-
-%% gen_statem.
-
-callback_mode() ->
- state_functions.
-
-init([]) ->
- {ok, state_name, #state{}}.
-
-state_name(_EventType, _EventData, StateData) ->
- {next_state, state_name, StateData}.
-
-handle_event(_EventType, _EventData, StateName, StateData) ->
- {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
- ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
- {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
- {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
- {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
- ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
- {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
- {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
- {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
- {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
- Req2 = cowboy_req:compact(Req),
- {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
- {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
- {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
- {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
- {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
- ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
- socket :: inet:socket(),
- transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
- Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
- {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
- ok = ranch:accept_ack(Ref),
- loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
- loop(State).
-endef
-
# Plugin-specific targets.
ifndef WS
@@ -406,6 +27,26 @@ WS = $(tab)
endif
endif
+ifdef SP
+define template_sp
+
+# By default templates indent with a single tab per indentation
+# level. Set this variable to the number of spaces you prefer:
+SP = $(SP)
+
+endef
+else
+template_sp =
+endif
+
+# @todo Additional template placeholders could be added.
+subst_template = $(subst rel_root_dir,$(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app),$(subst rel_deps_dir,$(call core_relpath,$(DEPS_DIR),$(APPS_DIR)/app),$(subst template_sp,$(template_sp),$(subst project_name,$p,$(subst template_name,$n,$1)))))
+
+define core_render_template
+ $(eval define _tpl_$(1)$(newline)$(call subst_template,$(tpl_$(1)))$(newline)endef)
+ $(verbose) $(call core_render,_tpl_$(1),$2)
+endef
+
bootstrap:
ifneq ($(wildcard src/),)
$(error Error: src/ directory already exists)
@@ -414,14 +55,13 @@ endif
$(if $(shell echo $p | LC_ALL=C grep -x "[a-z0-9_]*"),,\
$(error Error: Invalid characters in the application name))
$(eval n := $(PROJECT)_sup)
- $(verbose) $(call core_render,bs_Makefile,Makefile)
- $(verbose) echo "include erlang.mk" >> Makefile
+ $(verbose) $(call core_render_template,top_Makefile,Makefile)
$(verbose) mkdir src/
ifdef LEGACY
- $(verbose) $(call core_render,bs_appsrc,src/$(PROJECT).app.src)
+ $(verbose) $(call core_render_template,application.app.src,src/$(PROJECT).app.src)
endif
- $(verbose) $(call core_render,bs_app,src/$(PROJECT)_app.erl)
- $(verbose) $(call core_render,tpl_supervisor,src/$(PROJECT)_sup.erl)
+ $(verbose) $(call core_render_template,application,src/$(PROJECT)_app.erl)
+ $(verbose) $(call core_render_template,supervisor,src/$(PROJECT)_sup.erl)
bootstrap-lib:
ifneq ($(wildcard src/),)
@@ -430,11 +70,10 @@ endif
$(eval p := $(PROJECT))
$(if $(shell echo $p | LC_ALL=C grep -x "[a-z0-9_]*"),,\
$(error Error: Invalid characters in the application name))
- $(verbose) $(call core_render,bs_Makefile,Makefile)
- $(verbose) echo "include erlang.mk" >> Makefile
+ $(verbose) $(call core_render_template,top_Makefile,Makefile)
$(verbose) mkdir src/
ifdef LEGACY
- $(verbose) $(call core_render,bs_appsrc_lib,src/$(PROJECT).app.src)
+ $(verbose) $(call core_render_template,library.app.src,src/$(PROJECT).app.src)
endif
bootstrap-rel:
@@ -445,10 +84,12 @@ ifneq ($(wildcard config/),)
$(error Error: config/ directory already exists)
endif
$(eval p := $(PROJECT))
- $(verbose) $(call core_render,bs_relx_config,relx.config)
+ $(verbose) $(call core_render_template,relx.config,relx.config)
$(verbose) mkdir config/
- $(verbose) $(call core_render,bs_sys_config,config/sys.config)
- $(verbose) $(call core_render,bs_vm_args,config/vm.args)
+ $(verbose) $(call core_render_template,sys.config,config/sys.config)
+ $(verbose) $(call core_render_template,vm.args,config/vm.args)
+ $(verbose) awk '/^include erlang.mk/ && !ins {print "REL_DEPS += relx";ins=1};{print}' Makefile > Makefile.bak
+ $(verbose) mv Makefile.bak Makefile
new-app:
ifndef in
@@ -462,12 +103,12 @@ endif
$(error Error: Invalid characters in the application name))
$(eval n := $(in)_sup)
$(verbose) mkdir -p $(APPS_DIR)/$p/src/
- $(verbose) $(call core_render,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ $(verbose) $(call core_render_template,apps_Makefile,$(APPS_DIR)/$p/Makefile)
ifdef LEGACY
- $(verbose) $(call core_render,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+ $(verbose) $(call core_render_template,application.app.src,$(APPS_DIR)/$p/src/$p.app.src)
endif
- $(verbose) $(call core_render,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
- $(verbose) $(call core_render,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+ $(verbose) $(call core_render_template,application,$(APPS_DIR)/$p/src/$p_app.erl)
+ $(verbose) $(call core_render_template,supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
new-lib:
ifndef in
@@ -480,27 +121,37 @@ endif
$(if $(shell echo $p | LC_ALL=C grep -x "[a-z0-9_]*"),,\
$(error Error: Invalid characters in the application name))
$(verbose) mkdir -p $(APPS_DIR)/$p/src/
- $(verbose) $(call core_render,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ $(verbose) $(call core_render_template,apps_Makefile,$(APPS_DIR)/$p/Makefile)
ifdef LEGACY
- $(verbose) $(call core_render,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+ $(verbose) $(call core_render_template,library.app.src,$(APPS_DIR)/$p/src/$p.app.src)
endif
+# These are not necessary because we don't expose those as "normal" templates.
+BOOTSTRAP_TEMPLATES = apps_Makefile top_Makefile \
+ application.app.src library.app.src application \
+ relx.config sys.config vm.args
+
+# Templates may override the path they will be written to when using 'new'.
+# Only special template paths must be listed. Default is src/template_name.erl
+# Substitution is also applied to the paths. Examples:
+#
+#tplp_top_Makefile = Makefile
+#tplp_application.app.src = src/project_name.app.src
+#tplp_application = src/project_name_app.erl
+#tplp_relx.config = relx.config
+
+# Erlang.mk bundles its own templates at build time into the erlang.mk file.
+
new:
-ifeq ($(wildcard src/)$(in),)
- $(error Error: src/ directory does not exist)
-endif
-ifndef t
- $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef n
- $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
- $(verbose) $(call core_render,tpl_$(t),$(APPS_DIR)/$(in)/src/$(n).erl)
-else
- $(verbose) $(call core_render,tpl_$(t),src/$(n).erl)
-endif
+ $(if $(t),,$(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP]))
+ $(if $(n),,$(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP]))
+ $(if $(tpl_$(t)),,$(error Error: $t template does not exist; try $(Make) list-templates))
+ $(eval dest := $(if $(in),$(APPS_DIR)/$(in)/)$(call subst_template,$(if $(tplp_$(t)),$(tplp_$(t)),src/template_name.erl)))
+ $(if $(wildcard $(dir $(dest))),,$(error Error: $(dir $(dest)) directory does not exist))
+ $(if $(wildcard $(dest)),$(error Error: The file $(dest) already exists))
+ $(eval p := $(PROJECT))
+ $(call core_render_template,$(t),$(dest))
list-templates:
$(verbose) @echo Available templates:
- $(verbose) printf " %s\n" $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+ $(verbose) printf " %s\n" $(sort $(filter-out $(BOOTSTRAP_TEMPLATES),$(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES)))))
diff --git a/plugins/c_src.mk b/plugins/c_src.mk
index d6d5d15..fd9c2d7 100644
--- a/plugins/c_src.mk
+++ b/plugins/c_src.mk
@@ -15,17 +15,24 @@ C_SRC_TYPE ?= shared
ifeq ($(PLATFORM),msys2)
C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+ C_SRC_OUTPUT_STATIC_EXTENSION ?= .lib
else
C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+ C_SRC_OUTPUT_STATIC_EXTENSION ?= .a
endif
ifeq ($(C_SRC_TYPE),shared)
C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else ifeq ($(C_SRC_TYPE),static)
+ C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_STATIC_EXTENSION)
else
C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
endif
+RANLIB ?= ranlib
+ARFLAGS ?= cr
+
ifeq ($(PLATFORM),msys2)
# We hardcode the compiler used on MSYS2. The default CC=cc does
# not produce working code. The "gcc" MSYS2 package also doesn't.
@@ -35,9 +42,9 @@ ifeq ($(PLATFORM),msys2)
CXXFLAGS ?= -O3 -finline-functions -Wall
else ifeq ($(PLATFORM),darwin)
CC ?= cc
- CFLAGS ?= -O3 -std=c99 -arch x86_64 -Wall -Wmissing-prototypes
- CXXFLAGS ?= -O3 -arch x86_64 -Wall
- LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+ CFLAGS ?= -O3 -std=c99 -Wall -Wmissing-prototypes
+ CXXFLAGS ?= -O3 -Wall
+ LDFLAGS ?= -flat_namespace -undefined suppress
else ifeq ($(PLATFORM),freebsd)
CC ?= cc
CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
@@ -53,6 +60,11 @@ ifneq ($(PLATFORM),msys2)
CXXFLAGS += -fPIC
endif
+ifeq ($(C_SRC_TYPE),static)
+ CFLAGS += -DSTATIC_ERLANG_NIF=1
+ CXXFLAGS += -DSTATIC_ERLANG_NIF=1
+endif
+
CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
@@ -69,6 +81,12 @@ cpp_verbose = $(cpp_verbose_$(V))
link_verbose_0 = @echo " LD " $(@F);
link_verbose = $(link_verbose_$(V))
+ar_verbose_0 = @echo " AR " $(@F);
+ar_verbose = $(ar_verbose_$(V))
+
+ranlib_verbose_0 = @echo " RANLIB" $(@F);
+ranlib_verbose = $(ranlib_verbose_$(V))
+
# Targets.
ifeq ($(wildcard $(C_SRC_DIR)),)
@@ -97,11 +115,19 @@ app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+ifneq ($(C_SRC_TYPE),static)
$(C_SRC_OUTPUT_FILE): $(OBJECTS)
$(verbose) mkdir -p $(dir $@)
$(link_verbose) $(CC) $(OBJECTS) \
$(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-o $(C_SRC_OUTPUT_FILE)
+else
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+ $(verbose) mkdir -p $(dir $@)
+ $(ar_verbose) $(AR) $(ARFLAGS) $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+ $(ranlib_verbose) $(RANLIB) $(C_SRC_OUTPUT_FILE)
+endif
+
$(OBJECTS): $(MAKEFILE_LIST) $(C_SRC_ENV)
diff --git a/plugins/ci.mk b/plugins/ci.mk
index 4b902be..17110a5 100644
--- a/plugins/ci.mk
+++ b/plugins/ci.mk
@@ -4,24 +4,14 @@
.PHONY: ci ci-prepare ci-setup
CI_OTP ?=
-CI_HIPE ?=
-CI_ERLLVM ?=
-
-ifeq ($(CI_VM),native)
-ERLC_OPTS += +native
-TEST_ERLC_OPTS += +native
-else ifeq ($(CI_VM),erllvm)
-ERLC_OPTS += +native +'{hipe, [to_llvm]}'
-TEST_ERLC_OPTS += +native +'{hipe, [to_llvm]}'
-endif
-ifeq ($(strip $(CI_OTP) $(CI_HIPE) $(CI_ERLLVM)),)
+ifeq ($(strip $(CI_OTP)),)
ci::
else
-ci:: $(addprefix ci-,$(CI_OTP) $(addsuffix -native,$(CI_HIPE)) $(addsuffix -erllvm,$(CI_ERLLVM)))
+ci:: $(addprefix ci-,$(CI_OTP))
-ci-prepare: $(addprefix $(KERL_INSTALL_DIR)/,$(CI_OTP) $(addsuffix -native,$(CI_HIPE)))
+ci-prepare: $(addprefix ci-prepare-,$(CI_OTP))
ci-setup::
$(verbose) :
@@ -29,11 +19,14 @@ ci-setup::
ci-extra::
$(verbose) :
-ci_verbose_0 = @echo " CI " $(1);
+ci_verbose_0 = @echo " CI " $1;
ci_verbose = $(ci_verbose_$(V))
define ci_target
-ci-$1: $(KERL_INSTALL_DIR)/$2
+ci-prepare-$1: $(KERL_INSTALL_DIR)/$2
+ $(verbose) :
+
+ci-$1: ci-prepare-$1
$(verbose) $(MAKE) --no-print-directory clean
$(ci_verbose) \
PATH="$(KERL_INSTALL_DIR)/$2/bin:$(PATH)" \
@@ -45,11 +38,8 @@ ci-$1: $(KERL_INSTALL_DIR)/$2
endef
$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp),$(otp),otp)))
-$(foreach otp,$(CI_HIPE),$(eval $(call ci_target,$(otp)-native,$(otp)-native,native)))
-$(foreach otp,$(CI_ERLLVM),$(eval $(call ci_target,$(otp)-erllvm,$(otp)-native,erllvm)))
$(foreach otp,$(filter-out $(ERLANG_OTP),$(CI_OTP)),$(eval $(call kerl_otp_target,$(otp))))
-$(foreach otp,$(filter-out $(ERLANG_HIPE),$(sort $(CI_HIPE) $(CI_ERLLLVM))),$(eval $(call kerl_hipe_target,$(otp))))
help::
$(verbose) printf "%s\n" "" \
diff --git a/plugins/cover.mk b/plugins/cover.mk
index 68f5b98..395e8b8 100644
--- a/plugins/cover.mk
+++ b/plugins/cover.mk
@@ -8,6 +8,7 @@ COVER_DATA_DIR ?= $(COVER_REPORT_DIR)
ifdef COVER
COVER_APPS ?= $(notdir $(ALL_APPS_DIRS))
COVER_DEPS ?=
+COVER_EXCLUDE_MODS ?=
endif
# Code coverage for Common Test.
@@ -23,7 +24,8 @@ $(TEST_DIR)/ct.cover.spec: cover-data-dir
"{incl_dirs, '$(PROJECT)', [\"$(call core_native_path,$(CURDIR)/ebin)\" \
$(foreach a,$(COVER_APPS),$(comma) \"$(call core_native_path,$(APPS_DIR)/$a/ebin)\") \
$(foreach d,$(COVER_DEPS),$(comma) \"$(call core_native_path,$(DEPS_DIR)/$d/ebin)\")]}." \
- '{export,"$(call core_native_path,$(abspath $(COVER_DATA_DIR))/ct.coverdata)"}.' > $@
+ '{export,"$(call core_native_path,$(abspath $(COVER_DATA_DIR))/ct.coverdata)"}.' \
+ "{excl_mods, '$(PROJECT)', [$(call comma_list,$(COVER_EXCLUDE_MODS))]}." > $@
CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
endif
@@ -38,14 +40,18 @@ define cover.erl
Dirs = ["$(call core_native_path,$(CURDIR)/ebin)"
$(foreach a,$(COVER_APPS),$(comma) "$(call core_native_path,$(APPS_DIR)/$a/ebin)")
$(foreach d,$(COVER_DEPS),$(comma) "$(call core_native_path,$(DEPS_DIR)/$d/ebin)")],
- [begin
- case filelib:is_dir(Dir) of
- false -> false;
- true ->
- case cover:compile_beam_directory(Dir) of
- {error, _} -> halt(1);
- _ -> true
- end
+ Excludes = [$(call comma_list,$(foreach e,$(COVER_EXCLUDE_MODS),"$e"))],
+ [case file:list_dir(Dir) of
+ {error, enotdir} -> false;
+ {error, _} -> halt(2);
+ {ok, Files} ->
+ BeamFiles = [filename:join(Dir, File) ||
+ File <- Files,
+ not lists:member(filename:basename(File, ".beam"), Excludes),
+ filename:extension(File) =:= ".beam"],
+ case cover:compile_beam(BeamFiles) of
+ {error, _} -> halt(1);
+ _ -> true
end
end || Dir <- Dirs]
end,
diff --git a/plugins/ct.mk b/plugins/ct.mk
index ba65b2c..820af16 100644
--- a/plugins/ct.mk
+++ b/plugins/ct.mk
@@ -78,9 +78,9 @@ endif
endif
define ct_suite_target
-ct-$(1): test-build
- $(verbose) mkdir -p $(CT_LOGS_DIR)
- $(gen_verbose_esc) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+ct-$1: test-build
+ $$(verbose) mkdir -p $$(CT_LOGS_DIR)
+ $$(gen_verbose_esc) $$(CT_RUN) -sname ct_$$(PROJECT) -suite $$(addsuffix _SUITE,$1) $$(CT_EXTRA) $$(CT_OPTS)
endef
$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
diff --git a/plugins/dialyzer.mk b/plugins/dialyzer.mk
index 0ac2ef0..bb4723a 100644
--- a/plugins/dialyzer.mk
+++ b/plugins/dialyzer.mk
@@ -10,7 +10,7 @@ export DIALYZER_PLT
PLT_APPS ?=
DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+DIALYZER_OPTS ?= -Werror_handling -Wunmatched_returns # -Wunderspecs
DIALYZER_PLT_OPTS ?=
# Core targets.
@@ -69,6 +69,6 @@ dialyze: $(if $(filter --src,$(DIALYZER_DIRS)),,deps app)
else
dialyze: $(DIALYZER_PLT)
endif
- $(verbose) dialyzer --no_native `$(ERL) \
+ $(verbose) dialyzer `$(ERL) \
-eval "$(subst $(newline),,$(call escape_dquotes,$(call filter_opts.erl)))" \
-extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS) $(if $(wildcard ebin/),-pa ebin/)
diff --git a/plugins/edoc.mk b/plugins/edoc.mk
index 1d6c0f6..0a0e8eb 100644
--- a/plugins/edoc.mk
+++ b/plugins/edoc.mk
@@ -11,7 +11,11 @@ EDOC_OUTPUT ?= doc
define edoc.erl
SrcPaths = lists:foldl(fun(P, Acc) ->
- filelib:wildcard(atom_to_list(P) ++ "/{src,c_src}") ++ Acc
+ filelib:wildcard(atom_to_list(P) ++ "/{src,c_src}")
+ ++ lists:filter(fun(D) ->
+ filelib:is_dir(D)
+ end, filelib:wildcard(atom_to_list(P) ++ "/{src,c_src}/**"))
+ ++ Acc
end, [], [$(call comma_list,$(patsubst %,'%',$(call core_native_path,$(EDOC_SRC_DIRS))))]),
DefaultOpts = [{dir, "$(EDOC_OUTPUT)"}, {source_path, SrcPaths}, {subpackages, false}],
edoc:application($(1), ".", [$(2)] ++ DefaultOpts),
diff --git a/plugins/escript.mk b/plugins/escript.mk
index 3719684..4eac352 100644
--- a/plugins/escript.mk
+++ b/plugins/escript.mk
@@ -27,24 +27,52 @@ help::
# Plugin-specific targets.
-escript-zip:: FULL=1
-escript-zip:: deps app
- $(verbose) mkdir -p $(dir $(ESCRIPT_ZIP))
- $(verbose) rm -f $(ESCRIPT_ZIP_FILE)
- $(gen_verbose) cd .. && $(ESCRIPT_ZIP) $(ESCRIPT_ZIP_FILE) $(PROJECT)/ebin/*
+ALL_ESCRIPT_DEPS_DIRS = $(LOCAL_DEPS_DIRS) $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(DEPS)),$(call query_name,$(dep))))
+
+ESCRIPT_RUNTIME_DEPS_FILE ?= $(ERLANG_MK_TMP)/escript-deps.log
+
+escript-list-runtime-deps:
+ifeq ($(IS_DEP),)
+ $(verbose) rm -f $(ESCRIPT_RUNTIME_DEPS_FILE)
+endif
+ $(verbose) touch $(ESCRIPT_RUNTIME_DEPS_FILE)
+ $(verbose) set -e; for dep in $(ALL_ESCRIPT_DEPS_DIRS) ; do \
+ if ! grep -qs ^$$dep$$ $(ESCRIPT_RUNTIME_DEPS_FILE); then \
+ echo $$dep >> $(ESCRIPT_RUNTIME_DEPS_FILE); \
+ if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk|.*ERLANG_MK_FILENAME.*)$$" \
+ $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+ $(MAKE) -C $$dep escript-list-runtime-deps \
+ IS_DEP=1 \
+ ESCRIPT_RUNTIME_DEPS_FILE=$(ESCRIPT_RUNTIME_DEPS_FILE); \
+ fi \
+ fi \
+ done
+ifeq ($(IS_DEP),)
+ $(verbose) sort < $(ESCRIPT_RUNTIME_DEPS_FILE) | uniq > $(ESCRIPT_RUNTIME_DEPS_FILE).sorted
+ $(verbose) mv $(ESCRIPT_RUNTIME_DEPS_FILE).sorted $(ESCRIPT_RUNTIME_DEPS_FILE)
+endif
+
+escript-prepare: deps app
+ $(MAKE) escript-list-runtime-deps
+
+escript-zip:: escript-prepare
+ $(verbose) mkdir -p $(dir $(abspath $(ESCRIPT_ZIP_FILE)))
+ $(verbose) rm -f $(abspath $(ESCRIPT_ZIP_FILE))
+ $(gen_verbose) cd .. && $(ESCRIPT_ZIP) $(abspath $(ESCRIPT_ZIP_FILE)) $(notdir $(CURDIR))/ebin/*
ifneq ($(DEPS),)
- $(verbose) cd $(DEPS_DIR) && $(ESCRIPT_ZIP) $(ESCRIPT_ZIP_FILE) \
+ $(verbose) cd $(DEPS_DIR) && $(ESCRIPT_ZIP) $(abspath $(ESCRIPT_ZIP_FILE)) \
$(subst $(DEPS_DIR)/,,$(addsuffix /*,$(wildcard \
- $(addsuffix /ebin,$(shell cat $(ERLANG_MK_TMP)/deps.log)))))
+ $(addsuffix /ebin,$(shell cat $(ESCRIPT_RUNTIME_DEPS_FILE))))))
endif
+# @todo Only generate the zip file if there were changes.
escript:: escript-zip
$(gen_verbose) printf "%s\n" \
"#!$(ESCRIPT_SHEBANG)" \
"%% $(ESCRIPT_COMMENT)" \
"%%! $(ESCRIPT_EMU_ARGS)" > $(ESCRIPT_FILE)
- $(verbose) cat $(ESCRIPT_ZIP_FILE) >> $(ESCRIPT_FILE)
+ $(verbose) cat $(abspath $(ESCRIPT_ZIP_FILE)) >> $(ESCRIPT_FILE)
$(verbose) chmod +x $(ESCRIPT_FILE)
distclean-escript:
- $(gen_verbose) rm -f $(ESCRIPT_FILE)
+ $(gen_verbose) rm -f $(ESCRIPT_FILE) $(abspath $(ESCRIPT_ZIP_FILE))
diff --git a/plugins/eunit.mk b/plugins/eunit.mk
index aa4cc9a..8a97688 100644
--- a/plugins/eunit.mk
+++ b/plugins/eunit.mk
@@ -4,10 +4,16 @@
.PHONY: eunit apps-eunit
+# Eunit can be disabled by setting this to any other value.
+EUNIT ?= system
+
+ifeq ($(EUNIT),system)
+
# Configuration
EUNIT_OPTS ?=
EUNIT_ERL_OPTS ?=
+EUNIT_TEST_SPEC ?= $1
# Core targets.
@@ -23,7 +29,7 @@ help::
define eunit.erl
$(call cover.erl)
CoverSetup(),
- case eunit:test($1, [$(EUNIT_OPTS)]) of
+ case eunit:test($(call EUNIT_TEST_SPEC,$1), [$(EUNIT_OPTS)]) of
ok -> ok;
error -> halt(2)
end,
@@ -60,3 +66,5 @@ apps-eunit: test-build
exit $$eunit_retcode
endif
endif
+
+endif
diff --git a/plugins/hex.mk b/plugins/hex.mk
index b0a5339..72c0db6 100644
--- a/plugins/hex.mk
+++ b/plugins/hex.mk
@@ -1,37 +1,6 @@
# Copyright (c) 2020, Loïc Hoguin <[email protected]>
# This file is part of erlang.mk and subject to the terms of the ISC License.
-HEX_CORE_GIT ?= https://github.com/hexpm/hex_core
-HEX_CORE_COMMIT ?= v0.7.0
-
-PACKAGES += hex_core
-pkg_hex_core_name = hex_core
-pkg_hex_core_description = Reference implementation of Hex specifications
-pkg_hex_core_homepage = $(HEX_CORE_GIT)
-pkg_hex_core_fetch = git
-pkg_hex_core_repo = $(HEX_CORE_GIT)
-pkg_hex_core_commit = $(HEX_CORE_COMMIT)
-
-# We automatically depend on hex_core when the project isn't already.
-$(if $(filter hex_core,$(DEPS) $(BUILD_DEPS) $(DOC_DEPS) $(REL_DEPS) $(TEST_DEPS)),,\
- $(eval $(call dep_target,hex_core)))
-
-hex-core: $(DEPS_DIR)/hex_core
- $(verbose) if [ ! -e $(DEPS_DIR)/hex_core/ebin/dep_built ]; then \
- $(MAKE) -C $(DEPS_DIR)/hex_core IS_DEP=1; \
- touch $(DEPS_DIR)/hex_core/ebin/dep_built; \
- fi
-
-# @todo This must also apply to fetching.
-HEX_CONFIG ?=
-
-define hex_config.erl
- begin
- Config0 = hex_core:default_config(),
- Config0$(HEX_CONFIG)
- end
-endef
-
define hex_user_create.erl
{ok, _} = application:ensure_all_started(ssl),
{ok, _} = application:ensure_all_started(inets),
@@ -50,7 +19,7 @@ define hex_user_create.erl
endef
# The $(info ) call inserts a new line after the password prompt.
-hex-user-create: hex-core
+hex-user-create: $(DEPS_DIR)/hex_core/ebin/dep_built
$(if $(HEX_USERNAME),,$(eval HEX_USERNAME := $(shell read -p "Username: " username; echo $$username)))
$(if $(HEX_PASSWORD),,$(eval HEX_PASSWORD := $(shell stty -echo; read -p "Password: " password; stty echo; echo $$password) $(info )))
$(if $(HEX_EMAIL),,$(eval HEX_EMAIL := $(shell read -p "Email: " email; echo $$email)))
@@ -80,7 +49,7 @@ define hex_key_add.erl
end
endef
-hex-key-add: hex-core
+hex-key-add: $(DEPS_DIR)/hex_core/ebin/dep_built
$(if $(HEX_USERNAME),,$(eval HEX_USERNAME := $(shell read -p "Username: " username; echo $$username)))
$(if $(HEX_PASSWORD),,$(eval HEX_PASSWORD := $(shell stty -echo; read -p "Password: " password; stty echo; echo $$password) $(info )))
$(gen_verbose) $(call erlang,$(call hex_key_add.erl,$(HEX_USERNAME),$(HEX_PASSWORD),\
@@ -102,7 +71,7 @@ HEX_TARBALL_FILES ?= \
$(sort $(call core_find,priv/,*)) \
$(wildcard README*) \
$(wildcard rebar.config) \
- $(sort $(call core_find,src/,*))
+ $(sort $(if $(LEGACY),$(filter-out src/$(PROJECT).app.src,$(call core_find,src/,*)),$(call core_find,src/,*)))
HEX_TARBALL_OUTPUT_FILE ?= $(ERLANG_MK_TMP)/$(PROJECT).tar
@@ -122,7 +91,7 @@ define hex_tarball_create.erl
<<"$(if $(subst hex,,$(call query_fetch_method,$d)),$d,$(if $(word 3,$(dep_$d)),$(word 3,$(dep_$d)),$d))">> => #{
<<"app">> => <<"$d">>,
<<"optional">> => false,
- <<"requirement">> => <<"$(call query_version,$d)">>
+ <<"requirement">> => <<"$(if $(hex_req_$d),$(strip $(hex_req_$d)),$(call query_version,$d))">>
},)
$(if $(DEPS),dummy => dummy)
},
@@ -158,7 +127,7 @@ hex_tar_verbose_0 = @echo " TAR $(notdir $(ERLANG_MK_TMP))/$(@F)";
hex_tar_verbose_2 = set -x;
hex_tar_verbose = $(hex_tar_verbose_$(V))
-$(HEX_TARBALL_OUTPUT_FILE): hex-core app
+$(HEX_TARBALL_OUTPUT_FILE): $(DEPS_DIR)/hex_core/ebin/dep_built app
$(hex_tar_verbose) $(call erlang,$(call hex_tarball_create.erl))
hex-tarball-create: $(HEX_TARBALL_OUTPUT_FILE)
@@ -209,14 +178,14 @@ define hex_release_publish.erl
end
endef
-hex-release-tarball: hex-core $(HEX_TARBALL_OUTPUT_FILE)
+hex-release-tarball: $(DEPS_DIR)/hex_core/ebin/dep_built $(HEX_TARBALL_OUTPUT_FILE)
$(verbose) $(call erlang,$(call hex_release_publish_summary.erl))
-hex-release-publish: hex-core hex-release-tarball
+hex-release-publish: $(DEPS_DIR)/hex_core/ebin/dep_built hex-release-tarball
$(if $(HEX_SECRET),,$(eval HEX_SECRET := $(shell stty -echo; read -p "Secret: " secret; stty echo; echo $$secret) $(info )))
$(gen_verbose) $(call erlang,$(call hex_release_publish.erl,$(HEX_SECRET),false))
-hex-release-replace: hex-core hex-release-tarball
+hex-release-replace: $(DEPS_DIR)/hex_core/ebin/dep_built hex-release-tarball
$(if $(HEX_SECRET),,$(eval HEX_SECRET := $(shell stty -echo; read -p "Secret: " secret; stty echo; echo $$secret) $(info )))
$(gen_verbose) $(call erlang,$(call hex_release_publish.erl,$(HEX_SECRET),true))
@@ -235,7 +204,7 @@ define hex_release_delete.erl
end
endef
-hex-release-delete: hex-core
+hex-release-delete: $(DEPS_DIR)/hex_core/ebin/dep_built
$(if $(HEX_SECRET),,$(eval HEX_SECRET := $(shell stty -echo; read -p "Secret: " secret; stty echo; echo $$secret) $(info )))
$(gen_verbose) $(call erlang,$(call hex_release_delete.erl,$(HEX_SECRET)))
@@ -255,7 +224,7 @@ define hex_release_retire.erl
end
endef
-hex-release-retire: hex-core
+hex-release-retire: $(DEPS_DIR)/hex_core/ebin/dep_built
$(if $(HEX_SECRET),,$(eval HEX_SECRET := $(shell stty -echo; read -p "Secret: " secret; stty echo; echo $$secret) $(info )))
$(gen_verbose) $(call erlang,$(call hex_release_retire.erl,$(HEX_SECRET),\
$(if $(HEX_VERSION),$(HEX_VERSION),$(PROJECT_VERSION)),\
@@ -277,7 +246,7 @@ define hex_release_unretire.erl
end
endef
-hex-release-unretire: hex-core
+hex-release-unretire: $(DEPS_DIR)/hex_core/ebin/dep_built
$(if $(HEX_SECRET),,$(eval HEX_SECRET := $(shell stty -echo; read -p "Secret: " secret; stty echo; echo $$secret) $(info )))
$(gen_verbose) $(call erlang,$(call hex_release_unretire.erl,$(HEX_SECRET),\
$(if $(HEX_VERSION),$(HEX_VERSION),$(PROJECT_VERSION))))
@@ -286,7 +255,7 @@ HEX_DOCS_DOC_DIR ?= doc/
HEX_DOCS_TARBALL_FILES ?= $(sort $(call core_find,$(HEX_DOCS_DOC_DIR),*))
HEX_DOCS_TARBALL_OUTPUT_FILE ?= $(ERLANG_MK_TMP)/$(PROJECT)-docs.tar.gz
-$(HEX_DOCS_TARBALL_OUTPUT_FILE): hex-core app docs
+$(HEX_DOCS_TARBALL_OUTPUT_FILE): $(DEPS_DIR)/hex_core/ebin/dep_built app docs
$(hex_tar_verbose) tar czf $(HEX_DOCS_TARBALL_OUTPUT_FILE) -C $(HEX_DOCS_DOC_DIR) \
$(HEX_DOCS_TARBALL_FILES:$(HEX_DOCS_DOC_DIR)%=%)
@@ -310,7 +279,7 @@ define hex_docs_publish.erl
end
endef
-hex-docs-publish: hex-core hex-docs-tarball-create
+hex-docs-publish: $(DEPS_DIR)/hex_core/ebin/dep_built hex-docs-tarball-create
$(if $(HEX_SECRET),,$(eval HEX_SECRET := $(shell stty -echo; read -p "Secret: " secret; stty echo; echo $$secret) $(info )))
$(gen_verbose) $(call erlang,$(call hex_docs_publish.erl,$(HEX_SECRET)))
@@ -330,7 +299,7 @@ define hex_docs_delete.erl
end
endef
-hex-docs-delete: hex-core
+hex-docs-delete: $(DEPS_DIR)/hex_core/ebin/dep_built
$(if $(HEX_SECRET),,$(eval HEX_SECRET := $(shell stty -echo; read -p "Secret: " secret; stty echo; echo $$secret) $(info )))
$(gen_verbose) $(call erlang,$(call hex_docs_delete.erl,$(HEX_SECRET),\
$(if $(HEX_VERSION),$(HEX_VERSION),$(PROJECT_VERSION))))
diff --git a/plugins/proper.mk b/plugins/proper.mk
index 6262199..55a2788 100644
--- a/plugins/proper.mk
+++ b/plugins/proper.mk
@@ -37,8 +37,8 @@ define proper_check.erl
end of
true -> halt(0);
_ -> halt(1)
- catch error:undef ->
- io:format("Undefined property or module?~n~p~n", [erlang:get_stacktrace()]),
+ catch error:undef$(if $V,:Stacktrace) ->
+ io:format("Undefined property or module?~n$(if $V,~p~n)", [$(if $V,Stacktrace)]),
halt(0)
end.
endef
diff --git a/plugins/protobuffs.mk b/plugins/protobuffs.mk
index 809df42..0ebe159 100644
--- a/plugins/protobuffs.mk
+++ b/plugins/protobuffs.mk
@@ -41,10 +41,13 @@ else
define compile_proto.erl
[begin
gpb_compile:file(F, [
+ $(foreach i,$(sort $(dir $(PROTO_FILES))),{i$(comma) "$i"}$(comma))
{include_as_lib, true},
{module_name_suffix, "_pb"},
{o_hrl, "./include"},
- {o_erl, "./src"}])
+ {o_erl, "./src"},
+ {use_packages, true}
+ ])
end || F <- string:tokens("$1", " ")],
halt().
endef
diff --git a/plugins/relx.mk b/plugins/relx.mk
index 4e29031..2ee237f 100644
--- a/plugins/relx.mk
+++ b/plugins/relx.mk
@@ -1,15 +1,14 @@
# Copyright (c) 2013-2016, Loïc Hoguin <[email protected]>
# This file is part of erlang.mk and subject to the terms of the ISC License.
+ifeq ($(filter relx,$(BUILD_DEPS) $(DEPS) $(REL_DEPS)),relx)
.PHONY: relx-rel relx-relup distclean-relx-rel run
# Configuration.
-RELX ?= $(ERLANG_MK_TMP)/relx
RELX_CONFIG ?= $(CURDIR)/relx.config
+RELX_CONFIG_SCRIPT ?= $(CURDIR)/relx.config.script
-RELX_URL ?= https://erlang.mk/res/relx-v3.27.0
-RELX_OPTS ?=
RELX_OUTPUT_DIR ?= _rel
RELX_REL_EXT ?=
RELX_TAR ?= 1
@@ -18,16 +17,10 @@ ifdef SFX
RELX_TAR = 1
endif
-ifeq ($(firstword $(RELX_OPTS)),-o)
- RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
- RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
# Core targets.
ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
+ifneq ($(wildcard $(RELX_CONFIG))$(wildcard $(RELX_CONFIG_SCRIPT)),)
rel:: relx-rel
relup:: relx-relup
@@ -38,21 +31,81 @@ distclean:: distclean-relx-rel
# Plugin-specific targets.
-$(RELX): | $(ERLANG_MK_TMP)
- $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
- $(verbose) chmod +x $(RELX)
+define relx_get_config.erl
+ (fun() ->
+ Config0 =
+ case file:consult("$(call core_native_path,$(RELX_CONFIG))") of
+ {ok, Terms} ->
+ Terms;
+ {error, _} ->
+ []
+ end,
+ case filelib:is_file("$(call core_native_path,$(RELX_CONFIG_SCRIPT))") of
+ true ->
+ Bindings = erl_eval:add_binding('CONFIG', Config0, erl_eval:new_bindings()),
+ {ok, Config1} = file:script("$(call core_native_path,$(RELX_CONFIG_SCRIPT))", Bindings),
+ Config1;
+ false ->
+ Config0
+ end
+ end)()
+endef
+
+define relx_release.erl
+ Config = $(call relx_get_config.erl),
+ {release, {Name, Vsn0}, _} = lists:keyfind(release, 1, Config),
+ Vsn = case Vsn0 of
+ {cmd, Cmd} -> os:cmd(Cmd);
+ semver -> "";
+ {semver, _} -> "";
+ {git, short} -> string:trim(os:cmd("git rev-parse --short HEAD"), both, "\n");
+ {git, long} -> string:trim(os:cmd("git rev-parse HEAD"), both, "\n");
+ VsnStr -> Vsn0
+ end,
+ {ok, _} = relx:build_release(#{name => Name, vsn => Vsn}, Config ++ [{output_dir, "$(RELX_OUTPUT_DIR)"}]),
+ halt(0).
+endef
+
+define relx_tar.erl
+ Config = $(call relx_get_config.erl),
+ {release, {Name, Vsn0}, _} = lists:keyfind(release, 1, Config),
+ Vsn = case Vsn0 of
+ {cmd, Cmd} -> os:cmd(Cmd);
+ semver -> "";
+ {semver, _} -> "";
+ {git, short} -> string:trim(os:cmd("git rev-parse --short HEAD"), both, "\n");
+ {git, long} -> string:trim(os:cmd("git rev-parse HEAD"), both, "\n");
+ VsnStr -> Vsn0
+ end,
+ {ok, _} = relx:build_tar(#{name => Name, vsn => Vsn}, Config ++ [{output_dir, "$(RELX_OUTPUT_DIR)"}]),
+ halt(0).
+endef
+
+define relx_relup.erl
+ Config = $(call relx_get_config.erl),
+ {release, {Name, Vsn0}, _} = lists:keyfind(release, 1, Config),
+ Vsn = case Vsn0 of
+ {cmd, Cmd} -> os:cmd(Cmd);
+ semver -> "";
+ {semver, _} -> "";
+ {git, short} -> string:trim(os:cmd("git rev-parse --short HEAD"), both, "\n");
+ {git, long} -> string:trim(os:cmd("git rev-parse HEAD"), both, "\n");
+ VsnStr -> Vsn0
+ end,
+ {ok, _} = relx:build_relup(Name, Vsn, undefined, Config ++ [{output_dir, "$(RELX_OUTPUT_DIR)"}]),
+ halt(0).
+endef
-relx-rel: $(RELX) rel-deps app
- $(verbose) $(RELX) $(if $(filter 1,$V),-V 3) -c $(RELX_CONFIG) $(RELX_OPTS) release
+relx-rel: rel-deps app
+ $(call erlang,$(call relx_release.erl),-pa ebin/)
$(verbose) $(MAKE) relx-post-rel
-ifeq ($(RELX_TAR),1)
- $(verbose) $(RELX) $(if $(filter 1,$V),-V 3) -c $(RELX_CONFIG) $(RELX_OPTS) tar
-endif
+ $(if $(filter-out 0,$(RELX_TAR)),$(call erlang,$(call relx_tar.erl),-pa ebin/))
-relx-relup: $(RELX) rel-deps app
- $(verbose) $(RELX) $(if $(filter 1,$V),-V 3) -c $(RELX_CONFIG) $(RELX_OPTS) release
+relx-relup: rel-deps app
+ $(call erlang,$(call relx_release.erl),-pa ebin/)
$(MAKE) relx-post-rel
- $(verbose) $(RELX) $(if $(filter 1,$V),-V 3) -c $(RELX_CONFIG) $(RELX_OPTS) relup $(if $(filter 1,$(RELX_TAR)),tar)
+ $(call erlang,$(call relx_relup.erl),-pa ebin/)
+ $(if $(filter-out 0,$(RELX_TAR)),$(call erlang,$(call relx_tar.erl),-pa ebin/))
distclean-relx-rel:
$(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
@@ -63,17 +116,19 @@ relx-post-rel::
# Run target.
-ifeq ($(wildcard $(RELX_CONFIG)),)
+ifeq ($(wildcard $(RELX_CONFIG))$(wildcard $(RELX_CONFIG_SCRIPT)),)
run::
else
define get_relx_release.erl
- {ok, Config} = file:consult("$(call core_native_path,$(RELX_CONFIG))"),
+ Config = $(call relx_get_config.erl),
{release, {Name, Vsn0}, _} = lists:keyfind(release, 1, Config),
Vsn = case Vsn0 of
{cmd, Cmd} -> os:cmd(Cmd);
semver -> "";
{semver, _} -> "";
+ {git, short} -> string:trim(os:cmd("git rev-parse --short HEAD"), both, "\n");
+ {git, long} -> string:trim(os:cmd("git rev-parse HEAD"), both, "\n");
VsnStr -> Vsn0
end,
Extended = case lists:keyfind(extended_start_script, 1, Config) of
@@ -93,6 +148,7 @@ ifeq ($(PLATFORM),msys2)
RELX_REL_EXT := .cmd
endif
+run:: RELX_TAR := 0
run:: all
$(verbose) $(RELX_OUTPUT_DIR)/$(RELX_REL_NAME)/bin/$(RELX_REL_NAME)$(RELX_REL_EXT) $(RELX_REL_CMD)
@@ -100,7 +156,7 @@ ifdef RELOAD
rel::
$(verbose) $(RELX_OUTPUT_DIR)/$(RELX_REL_NAME)/bin/$(RELX_REL_NAME)$(RELX_REL_EXT) ping
$(verbose) $(RELX_OUTPUT_DIR)/$(RELX_REL_NAME)/bin/$(RELX_REL_NAME)$(RELX_REL_EXT) \
- eval "io:format(\"~p~n\", [c:lm()])"
+ eval "io:format(\"~p~n\", [c:lm()])."
endif
help::
@@ -109,3 +165,4 @@ help::
" run Compile the project, build the release and run it"
endif
+endif
diff --git a/plugins/triq.mk b/plugins/triq.mk
index 8791e2c..6d41376 100644
--- a/plugins/triq.mk
+++ b/plugins/triq.mk
@@ -26,8 +26,8 @@ define triq_check.erl
end of
true -> halt(0);
_ -> halt(1)
- catch error:undef ->
- io:format("Undefined property or module?~n~p~n", [erlang:get_stacktrace()]),
+ catch error:undef$(if $V,:Stacktrace) ->
+ io:format("Undefined property or module?~n$(if $V,~p~n)", [$(if $V,Stacktrace)]),
halt(0)
end.
endef
diff --git a/plugins/xref.mk b/plugins/xref.mk
index 7da0f37..0ecace2 100644
--- a/plugins/xref.mk
+++ b/plugins/xref.mk
@@ -1,39 +1,218 @@
-# Copyright (c) 2016, Loïc Hoguin <[email protected]>
-# Copyright (c) 2015, Erlang Solutions Ltd.
+# Copyright (c) 2022, Loïc Hoguin <[email protected]>
# This file is part of erlang.mk and subject to the terms of the ISC License.
-.PHONY: xref distclean-xref
+.PHONY: xref
# Configuration.
-ifeq ($(XREF_CONFIG),)
- XREFR_ARGS :=
-else
- XREFR_ARGS := -c $(XREF_CONFIG)
-endif
+# We do not use locals_not_used or deprecated_function_calls
+# because the compiler will error out by default in those
+# cases with Erlang.mk. Deprecated functions may make sense
+# in some cases but few libraries define them. We do not
+# use exports_not_used by default because it hinders more
+# than it helps library projects such as Cowboy. Finally,
+# undefined_functions provides little that undefined_function_calls
+# doesn't already provide, so it's not enabled by default.
+XREF_CHECKS ?= [undefined_function_calls]
+
+# Instead of predefined checks a query can be evaluated
+# using the Xref DSL. The $q variable is used in that case.
+
+# The scope is a list of keywords that correspond to
+# application directories, being essentially an easy way
+# to configure which applications to analyze. With:
+#
+# - app: .
+# - apps: $(ALL_APPS_DIRS)
+# - deps: $(ALL_DEPS_DIRS)
+# - otp: Built-in Erlang/OTP applications.
+#
+# The default is conservative (app) and will not be
+# appropriate for all types of queries (for example
+# application_call requires adding all applications
+# that might be called or they will not be found).
+XREF_SCOPE ?= app # apps deps otp
+
+# If the above is not enough, additional application
+# directories can be configured.
+XREF_EXTRA_APP_DIRS ?=
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
+# As well as additional non-application directories.
+XREF_EXTRA_DIRS ?=
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/1.1.0/xrefr
+# Erlang.mk supports -ignore_xref([...]) with forms
+# {M, F, A} | {F, A} | M, the latter ignoring whole
+# modules. Ignores can also be provided project-wide.
+XREF_IGNORE ?= []
+
+# All callbacks may be ignored. Erlang.mk will ignore
+# them automatically for exports_not_used (unless it
+# is explicitly disabled by the user).
+XREF_IGNORE_CALLBACKS ?=
# Core targets.
help::
$(verbose) printf '%s\n' '' \
'Xref targets:' \
- ' xref Run Xrefr using $$XREF_CONFIG as config file if defined'
-
-distclean:: distclean-xref
+ ' xref Analyze the project using Xref' \
+ ' xref q=QUERY Evaluate an Xref query'
# Plugin-specific targets.
-$(XREFR):
- $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
- $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
- $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+define xref.erl
+ {ok, Xref} = xref:start([]),
+ Scope = [$(call comma_list,$(XREF_SCOPE))],
+ AppDirs0 = [$(call comma_list,$(foreach d,$(XREF_EXTRA_APP_DIRS),"$d"))],
+ AppDirs1 = case lists:member(otp, Scope) of
+ false -> AppDirs0;
+ true ->
+ RootDir = code:root_dir(),
+ AppDirs0 ++ [filename:dirname(P) || P <- code:get_path(), lists:prefix(RootDir, P)]
+ end,
+ AppDirs2 = case lists:member(deps, Scope) of
+ false -> AppDirs1;
+ true -> [$(call comma_list,$(foreach d,$(ALL_DEPS_DIRS),"$d"))] ++ AppDirs1
+ end,
+ AppDirs3 = case lists:member(apps, Scope) of
+ false -> AppDirs2;
+ true -> [$(call comma_list,$(foreach d,$(ALL_APPS_DIRS),"$d"))] ++ AppDirs2
+ end,
+ AppDirs = case lists:member(app, Scope) of
+ false -> AppDirs3;
+ true -> ["../$(notdir $(CURDIR))"|AppDirs3]
+ end,
+ [{ok, _} = xref:add_application(Xref, AppDir, [{builtins, true}]) || AppDir <- AppDirs],
+ ExtraDirs = [$(call comma_list,$(foreach d,$(XREF_EXTRA_DIRS),"$d"))],
+ [{ok, _} = xref:add_directory(Xref, ExtraDir, [{builtins, true}]) || ExtraDir <- ExtraDirs],
+ ok = xref:set_library_path(Xref, code:get_path() -- (["ebin", "."] ++ AppDirs ++ ExtraDirs)),
+ Checks = case {$1, is_list($2)} of
+ {check, true} -> $2;
+ {check, false} -> [$2];
+ {query, _} -> [$2]
+ end,
+ FinalRes = [begin
+ IsInformational = case $1 of
+ query -> true;
+ check ->
+ is_tuple(Check) andalso
+ lists:member(element(1, Check),
+ [call, use, module_call, module_use, application_call, application_use])
+ end,
+ {ok, Res0} = case $1 of
+ check -> xref:analyze(Xref, Check);
+ query -> xref:q(Xref, Check)
+ end,
+ Res = case IsInformational of
+ true -> Res0;
+ false ->
+ lists:filter(fun(R) ->
+ {Mod, InMFA, MFA} = case R of
+ {InMFA0 = {M, _, _}, MFA0} -> {M, InMFA0, MFA0};
+ {M, _, _} -> {M, R, R}
+ end,
+ Attrs = try
+ Mod:module_info(attributes)
+ catch error:undef ->
+ []
+ end,
+ InlineIgnores = lists:flatten([
+ [case V of
+ M when is_atom(M) -> {M, '_', '_'};
+ {F, A} -> {Mod, F, A};
+ _ -> V
+ end || V <- Values]
+ || {ignore_xref, Values} <- Attrs]),
+ BuiltinIgnores = [
+ {eunit_test, wrapper_test_exported_, 0}
+ ],
+ DoCallbackIgnores = case {Check, "$(strip $(XREF_IGNORE_CALLBACKS))"} of
+ {exports_not_used, ""} -> true;
+ {_, "0"} -> false;
+ _ -> true
+ end,
+ CallbackIgnores = case DoCallbackIgnores of
+ false -> [];
+ true ->
+ Behaviors = lists:flatten([
+ [BL || {behavior, BL} <- Attrs],
+ [BL || {behaviour, BL} <- Attrs]
+ ]),
+ [{Mod, CF, CA} || B <- Behaviors, {CF, CA} <- B:behaviour_info(callbacks)]
+ end,
+ WideIgnores = if
+ is_list($(XREF_IGNORE)) ->
+ [if is_atom(I) -> {I, '_', '_'}; true -> I end
+ || I <- $(XREF_IGNORE)];
+ true -> [$(XREF_IGNORE)]
+ end,
+ Ignores = InlineIgnores ++ BuiltinIgnores ++ CallbackIgnores ++ WideIgnores,
+ not (lists:member(InMFA, Ignores)
+ orelse lists:member(MFA, Ignores)
+ orelse lists:member({Mod, '_', '_'}, Ignores))
+ end, Res0)
+ end,
+ case Res of
+ [] -> ok;
+ _ when IsInformational ->
+ case Check of
+ {call, {CM, CF, CA}} ->
+ io:format("Functions that ~s:~s/~b calls:~n", [CM, CF, CA]);
+ {use, {CM, CF, CA}} ->
+ io:format("Function ~s:~s/~b is called by:~n", [CM, CF, CA]);
+ {module_call, CMod} ->
+ io:format("Modules that ~s calls:~n", [CMod]);
+ {module_use, CMod} ->
+ io:format("Module ~s is used by:~n", [CMod]);
+ {application_call, CApp} ->
+ io:format("Applications that ~s calls:~n", [CApp]);
+ {application_use, CApp} ->
+ io:format("Application ~s is used by:~n", [CApp]);
+ _ when $1 =:= query ->
+ io:format("Query ~s returned:~n", [Check])
+ end,
+ [case R of
+ {{InM, InF, InA}, {M, F, A}} ->
+ io:format("- ~s:~s/~b called by ~s:~s/~b~n",
+ [M, F, A, InM, InF, InA]);
+ {M, F, A} ->
+ io:format("- ~s:~s/~b~n", [M, F, A]);
+ ModOrApp ->
+ io:format("- ~s~n", [ModOrApp])
+ end || R <- Res],
+ ok;
+ _ ->
+ [case {Check, R} of
+ {undefined_function_calls, {{InM, InF, InA}, {M, F, A}}} ->
+ io:format("Undefined function ~s:~s/~b called by ~s:~s/~b~n",
+ [M, F, A, InM, InF, InA]);
+ {undefined_functions, {M, F, A}} ->
+ io:format("Undefined function ~s:~s/~b~n", [M, F, A]);
+ {locals_not_used, {M, F, A}} ->
+ io:format("Unused local function ~s:~s/~b~n", [M, F, A]);
+ {exports_not_used, {M, F, A}} ->
+ io:format("Unused exported function ~s:~s/~b~n", [M, F, A]);
+ {deprecated_function_calls, {{InM, InF, InA}, {M, F, A}}} ->
+ io:format("Deprecated function ~s:~s/~b called by ~s:~s/~b~n",
+ [M, F, A, InM, InF, InA]);
+ {deprecated_functions, {M, F, A}} ->
+ io:format("Deprecated function ~s:~s/~b~n", [M, F, A]);
+ _ ->
+ io:format("~p: ~p~n", [Check, R])
+ end || R <- Res],
+ error
+ end
+ end || Check <- Checks],
+ stopped = xref:stop(Xref),
+ case lists:usort(FinalRes) of
+ [ok] -> halt(0);
+ _ -> halt(1)
+ end
+endef
-distclean-xref:
- $(gen_verbose) rm -rf $(XREFR)
+xref: deps app
+ifdef q
+ $(verbose) $(call erlang,$(call xref.erl,query,"$q"),-pa ebin/)
+else
+ $(verbose) $(call erlang,$(call xref.erl,check,$(XREF_CHECKS)),-pa ebin/)
+endif
diff --git a/scrape_hexpm.sh b/scrape_hexpm.sh
new file mode 100755
index 0000000..be83caf
--- /dev/null
+++ b/scrape_hexpm.sh
@@ -0,0 +1,46 @@
+#!/usr/bin/sh
+
+# This script will scrape packages from hex.pm that are believed to be
+# Erlang packages. We do this by first walking through all packages and
+# then getting the most recent release of each package. If the build tools
+# listed contain "rebar3" we keep them and write the package
+# name and version to a file.
+#
+# This script should only be run occasionally to refresh the file
+# containing the list of packages.
+#
+# @todo Some of the projects fetched are Elixir despite indicating
+# "rebar3" or "make". We should ignore them here once identified
+# so they don't make it to the output.
+
+NUM=1
+
+while true; do
+
+ echo "# Packages page $NUM"
+
+ PAGE=$(curl -s "https://hex.pm/api/packages?sort=name&page=$NUM")
+
+ if [ "$PAGE" = "[]" ]; then exit 0; fi
+
+ PACKAGES=$(echo $PAGE | jq -r "map({name: .name, url: .releases[0].url})")
+
+ echo $PACKAGES | jq -r '.[] | [.name, .url] | join(" ")' | while read -r NAMEURL; do
+
+ NAME=$(echo $NAMEURL | awk '{print $1;}')
+ URL=$(echo $NAMEURL | awk '{print $2;}')
+
+ VERSION=$(curl -s "$URL" | jq 'select(.meta.build_tools | index("rebar3")) | .version | tostring')
+ VERSION=$(echo $VERSION | tr -d '"')
+
+ if [ -n "$VERSION" ]; then
+ echo "$NAME $VERSION"
+ fi
+
+ done
+
+ NUM=$(expr $NUM + 1)
+
+ sleep 10
+
+done
diff --git a/templates/application.app.src b/templates/application.app.src
new file mode 100644
index 0000000..3bd1d6b
--- /dev/null
+++ b/templates/application.app.src
@@ -0,0 +1,13 @@
+{application, project_name, [
+ {description, ""},
+ {vsn, "0.1.0"},
+ {id, "git"},
+ {modules, []},
+ {registered, []},
+ {applications, [
+ kernel,
+ stdlib
+ ]},
+ {mod, {project_name_app, []}},
+ {env, []}
+]}.
diff --git a/templates/application.erl b/templates/application.erl
new file mode 100644
index 0000000..2c8d27b
--- /dev/null
+++ b/templates/application.erl
@@ -0,0 +1,11 @@
+-module(project_name_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+ project_name_sup:start_link().
+
+stop(_State) ->
+ ok.
diff --git a/templates/apps_Makefile b/templates/apps_Makefile
new file mode 100644
index 0000000..093287f
--- /dev/null
+++ b/templates/apps_Makefile
@@ -0,0 +1,10 @@
+PROJECT = project_name
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.1.0
+template_sp
+# Make sure we know where the applications are located.
+ROOT_DIR ?= rel_root_dir
+APPS_DIR ?= ..
+DEPS_DIR ?= rel_deps_dir
+
+include rel_root_dir/erlang.mk
diff --git a/templates/cowboy_http_h.erl b/templates/cowboy_http_h.erl
new file mode 100644
index 0000000..a2c3200
--- /dev/null
+++ b/templates/cowboy_http_h.erl
@@ -0,0 +1,19 @@
+-module(template_name).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+ {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+ {ok, Req2} = cowboy_req:reply(200, Req),
+ {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+ ok.
diff --git a/templates/cowboy_loop_h.erl b/templates/cowboy_loop_h.erl
new file mode 100644
index 0000000..ce301c9
--- /dev/null
+++ b/templates/cowboy_loop_h.erl
@@ -0,0 +1,18 @@
+-module(template_name).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+ {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+ {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+ ok.
diff --git a/templates/cowboy_rest_h.erl b/templates/cowboy_rest_h.erl
new file mode 100644
index 0000000..a15f4a5
--- /dev/null
+++ b/templates/cowboy_rest_h.erl
@@ -0,0 +1,14 @@
+-module(template_name).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+ {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+ {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+ {<<"<html><body>This is REST!</body></html>">>, Req, State}.
diff --git a/templates/cowboy_websocket_h.erl b/templates/cowboy_websocket_h.erl
new file mode 100644
index 0000000..538f020
--- /dev/null
+++ b/templates/cowboy_websocket_h.erl
@@ -0,0 +1,31 @@
+-module(template_name).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+ {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+ Req2 = cowboy_req:compact(Req),
+ {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+ {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+ {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+ {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+ {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+ ok.
diff --git a/templates/gen_fsm.erl b/templates/gen_fsm.erl
new file mode 100644
index 0000000..73505df
--- /dev/null
+++ b/templates/gen_fsm.erl
@@ -0,0 +1,50 @@
+-module(template_name).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+ gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+ {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+ {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+ {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+ {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+ {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+ {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+ ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+ {ok, StateName, StateData}.
diff --git a/templates/gen_server.erl b/templates/gen_server.erl
new file mode 100644
index 0000000..d297edf
--- /dev/null
+++ b/templates/gen_server.erl
@@ -0,0 +1,42 @@
+-module(template_name).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+ gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+ {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+ {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+ {noreply, State}.
+
+handle_info(_Info, State) ->
+ {noreply, State}.
+
+terminate(_Reason, _State) ->
+ ok.
+
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
diff --git a/templates/gen_statem.erl b/templates/gen_statem.erl
new file mode 100644
index 0000000..afdf20f
--- /dev/null
+++ b/templates/gen_statem.erl
@@ -0,0 +1,42 @@
+-module(template_name).
+-behaviour(gen_statem).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_statem.
+-export([callback_mode/0]).
+-export([init/1]).
+-export([state_name/3]).
+-export([handle_event/4]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+ gen_statem:start_link(?MODULE, [], []).
+
+%% gen_statem.
+
+callback_mode() ->
+ state_functions.
+
+init([]) ->
+ {ok, state_name, #state{}}.
+
+state_name(_EventType, _EventData, StateData) ->
+ {next_state, state_name, StateData}.
+
+handle_event(_EventType, _EventData, StateName, StateData) ->
+ {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+ ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+ {ok, StateName, StateData}.
diff --git a/templates/library.app.src b/templates/library.app.src
new file mode 100644
index 0000000..e7f7d75
--- /dev/null
+++ b/templates/library.app.src
@@ -0,0 +1,11 @@
+{application, project_name, [
+ {description, ""},
+ {vsn, "0.1.0"},
+ {id, "git"},
+ {modules, []},
+ {registered, []},
+ {applications, [
+ kernel,
+ stdlib
+ ]}
+]}.
diff --git a/templates/module.erl b/templates/module.erl
new file mode 100644
index 0000000..30a3b1a
--- /dev/null
+++ b/templates/module.erl
@@ -0,0 +1,2 @@
+-module(template_name).
+-export([]).
diff --git a/templates/ranch_protocol.erl b/templates/ranch_protocol.erl
new file mode 100644
index 0000000..1458815
--- /dev/null
+++ b/templates/ranch_protocol.erl
@@ -0,0 +1,25 @@
+-module(template_name).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+ socket :: inet:socket(),
+ transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+ Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+ {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+ ok = ranch:accept_ack(Ref),
+ loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+ loop(State).
diff --git a/templates/relx.config b/templates/relx.config
new file mode 100644
index 0000000..3a23af7
--- /dev/null
+++ b/templates/relx.config
@@ -0,0 +1,6 @@
+{release, {project_name_release, "1"}, [project_name, sasl, runtime_tools]}.
+{dev_mode, false}.
+{include_erts, true}.
+{extended_start_script, true}.
+{sys_config, "config/sys.config"}.
+{vm_args, "config/vm.args"}.
diff --git a/templates/supervisor.erl b/templates/supervisor.erl
new file mode 100644
index 0000000..b4ddf91
--- /dev/null
+++ b/templates/supervisor.erl
@@ -0,0 +1,12 @@
+-module(template_name).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+ supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+ Procs = [],
+ {ok, {{one_for_one, 1, 5}, Procs}}.
diff --git a/templates/sys.config b/templates/sys.config
new file mode 100644
index 0000000..0dbd0fd
--- /dev/null
+++ b/templates/sys.config
@@ -0,0 +1,2 @@
+[
+].
diff --git a/templates/top_Makefile b/templates/top_Makefile
new file mode 100644
index 0000000..137993f
--- /dev/null
+++ b/templates/top_Makefile
@@ -0,0 +1,5 @@
+PROJECT = project_name
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.1.0
+template_sp
+include erlang.mk
diff --git a/templates/vm.args b/templates/vm.args
new file mode 100644
index 0000000..99a5076
--- /dev/null
+++ b/templates/vm.args
@@ -0,0 +1,3 @@
+-setcookie project_name
+-heart
diff --git a/test/Makefile b/test/Makefile
index 0517684..9bd9168 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -13,10 +13,12 @@ endif
# Temporary application name, taken from rule name.
APP = test_$(subst -,_,$@)
+CACHE_DIR = $(CURDIR)/$(APP)/.cache
+export CACHE_DIR
# Erlang, quickly!
-ERL = erl +A0 -noinput -boot no_dot_erlang
+ERL = erl -noinput -boot no_dot_erlang -kernel start_distribution false +P 1024 +Q 1024
# Platform detection, condensed version.
@@ -123,32 +125,44 @@ endef
.PHONY: all clean init
-all:: core
+all::
+ $t :
clean::
- $t rm -rf erl_crash.dump packages/ $(filter-out test_rebar_git/,$(wildcard test_*/))
+ $t rm -rf erl_crash.dump packages/ $(filter-out test_hex_core_git/ test_rebar_git/,$(wildcard test_*/))
init: clean
- $i "Prefetch Rebar if necessary"
+ $i "Prefetch hex_core if necessary"
+ $t if [ ! -d test_hex_core_git ]; then \
+ git clone -q -n -- https://github.com/hexpm/hex_core test_hex_core_git; \
+ fi
+
+ $i "Prefetch rebar if necessary"
$t if [ ! -d test_rebar_git ]; then \
- git clone -q -n -- https://github.com/rebar/rebar test_rebar_git; \
+ git clone -q -n -- https://github.com/erlang/rebar3 test_rebar_git; \
fi
$i "Generate a bleeding edge Erlang.mk"
$t cd .. && $(MAKE) $v
-REBAR_GIT = file://$(CURDIR)/test_rebar_git
-export REBAR_GIT
+HEX_CORE_GIT = file://$(CURDIR)/test_hex_core_git
+export HEX_CORE_GIT
+
+REBAR3_GIT = file://$(CURDIR)/test_rebar_git
+export REBAR3_GIT
# Core.
.PHONY: core
-define include_core
-core:: core-$1
+CORE_TARGETS :=
+PLUGINS_TARGETS :=
+define include_core
include core_$1.mk
+CORE_TARGETS += $$(core_$1_TARGETS)
+
endef
$(eval $(foreach t,$(patsubst %.mk,%,$(patsubst core_%,%,$(wildcard core_*.mk))),$(call include_core,$t)))
@@ -156,18 +170,24 @@ $(eval $(foreach t,$(patsubst %.mk,%,$(patsubst core_%,%,$(wildcard core_*.mk)))
# Plugins.
define include_plugin
-all:: $1
-
include plugin_$1.mk
+PLUGINS_TARGETS += $$($1_TARGETS)
+
endef
$(eval $(foreach t,$(patsubst %.mk,%,$(patsubst plugin_%,%,$(wildcard plugin_*.mk))),$(call include_plugin,$t)))
+core:: $(CORE_TARGETS)
+
+all:: $(CORE_TARGETS) $(PLUGINS_TARGETS)
+
# Packages.
PACKAGES = $(foreach pkg,$(sort $(wildcard ../index/*.mk)),$(notdir $(basename $(pkg))))
-EXCLUDE_FROM_CHECK = ['ci.erlang.mk', esh_mk, hexer_mk, inaka_mk, 'lfe.mk', rabbitmq_codegen]
+PATCHES = ELIXIR_PATCH=1 HUT_PATCH=1
+EXCLUDE_FROM_CHECK = ['ci.erlang.mk', elvis_mk, esh_mk, hexer_mk, inaka_mk, 'lfe.mk', pmod_transform, rust_mk]
+EXCLUDE_FROM_APP_CHECK = esh_mk pmod_transform rust_mk
packages: $(addprefix pkg-,$(PACKAGES))
@@ -196,11 +216,122 @@ pkg-$1: init
false; \
fi
+ $(if $(filter $1,$(EXCLUDE_FROM_APP_CHECK)),,
+ $i "Check that $1 has a .app file"
+ $t if ! test -f packages/$1_pkg/deps/$(APP_NAME)/ebin/$(APP_NAME).app; then \
+ echo "$1: no .app file" >> packages/errors.log; \
+ false; \
+ fi)
+
+ $i "Check that all applications and their modules can be loaded"
+ $t if ! ( cd packages/$1_pkg/ && $(ERL) -pa deps/*/ebin/ -eval " \
+ Apps0 = [list_to_atom(App) || \"deps/\" ++ App \
+ <- filelib:wildcard(\"deps/*\")], \
+ Apps = [App || App <- Apps0, not lists:member(App, $(EXCLUDE_FROM_CHECK))], \
+ [begin \
+ io:format(\"Loading application ~p~n\", [App]), \
+ case application:load(App) of \
+ ok -> ok; \
+ {error, {already_loaded, App}} -> ok \
+ end, \
+ {ok, Mods} = application:get_key(App, modules), \
+ [try io:format(\" Loading module ~p~n\", [Mod]), \
+ {module, Mod} = code:load_file(Mod) \
+ catch C:R -> timer:sleep(500), erlang:C(R) \
+ end || Mod <- Mods] \
+ end || App <- Apps], \
+ halt()." ); then \
+ echo "$1: load error" >> packages/errors.log; \
+ false; \
+ fi
+
+ $i "Recompile package $1"
+ $t if ! ( cd packages/$1_pkg/ && $(MAKE) $(PATCHES) FULL=1 $v ); then \
+ echo "$(1): recompile error" >> packages/errors.log; \
+ false; \
+ fi
+
+ $(if $(filter $1,$(EXCLUDE_FROM_APP_CHECK)),,
+ $i "Check that $1 has a .app file"
+ $t if ! test -f packages/$1_pkg/deps/$(APP_NAME)/ebin/$(APP_NAME).app; then \
+ echo "$1: no .app file" >> packages/errors.log; \
+ false; \
+ fi)
+
+ $i "Check that all applications and their modules can still be loaded"
+ $t if ! ( cd packages/$1_pkg/ && $(ERL) -pa deps/*/ebin/ -eval " \
+ Apps0 = [list_to_atom(App) || \"deps/\" ++ App \
+ <- filelib:wildcard(\"deps/*\")], \
+ Apps = [App || App <- Apps0, not lists:member(App, $(EXCLUDE_FROM_CHECK))], \
+ [begin \
+ io:format(\"Loading application ~p~n\", [App]), \
+ case application:load(App) of \
+ ok -> ok; \
+ {error, {already_loaded, App}} -> ok \
+ end, \
+ {ok, Mods} = application:get_key(App, modules), \
+ [try io:format(\" Loading module ~p~n\", [Mod]), \
+ {module, Mod} = code:load_file(Mod) \
+ catch C:R -> timer:sleep(500), erlang:C(R) \
+ end || Mod <- Mods] \
+ end || App <- Apps], \
+ halt()." ); then \
+ echo "$1: recompile+load error" >> packages/errors.log; \
+ false; \
+ fi
+
+ $i "Check that no erl_crash.dump file exists"
+ $t if ( ! find packages/$1_pkg/ -type f -name erl_crash.dump ); then \
+ echo "$(1): erl_crash.dump found" >> packages/errors.log; \
+ fi
+
+ $(if $(KEEP_BUILDS),,
+ $i "OK; delete the build directory"
+ $t rm -rf packages/$1_pkg/)
+endef
+
+$(foreach pkg,$(PACKAGES),$(eval $(call pkg_target,$(pkg))))
+
+# Hex.pm packages.
+
+ifdef HEXPM
+
+HEXPM_PACKAGES =
+
+define hexpm_pkg_target
+HEXPM_PACKAGES += $1
+
+.PHONY: hexpm-pkg-$1
+
+hexpm-pkg-$1: init
+
+# Make sure $@ is defined inside the define.
+ $(eval @ = hexpm-pkg-$1)
+
+# @todo Get the real application's name. How?
+ $(eval APP_NAME := $1)
+
+ $i "Bootstrap a new OTP library in packages/$1_pkg"
+ $t mkdir -p packages/$1_pkg/
+ $t cp ../erlang.mk packages/$1_pkg/
+ $t cd packages/$1_pkg/ && $(MAKE) -f erlang.mk bootstrap-lib $v
+
+ $i "Add package $1 to the Makefile"
+ $t perl -ni.bak -e 'print;if ($$$$.==1) {print "DEPS = $1\ndep_$1 = hex $2\n"}' packages/$1_pkg/Makefile
+
+ $i "Compile package $1"
+ $t if ! ( cd packages/$1_pkg/ && $(MAKE) $(PATCHES) $v ); then \
+ echo "$1: compile error" >> packages/errors.log; \
+ false; \
+ fi
+
+# $(if $(filter $1,$(EXCLUDE_FROM_APP_CHECK)),,
$i "Check that $1 has a .app file"
$t if ! test -f packages/$1_pkg/deps/$(APP_NAME)/ebin/$(APP_NAME).app; then \
echo "$1: no .app file" >> packages/errors.log; \
false; \
fi
+# )
$i "Check that all applications and their modules can be loaded"
$t if ! ( cd packages/$1_pkg/ && $(ERL) -pa deps/*/ebin/ -eval " \
@@ -230,11 +361,13 @@ pkg-$1: init
false; \
fi
+# $(if $(filter $1,$(EXCLUDE_FROM_APP_CHECK)),,
$i "Check that $1 has a .app file"
$t if ! test -f packages/$1_pkg/deps/$(APP_NAME)/ebin/$(APP_NAME).app; then \
echo "$1: no .app file" >> packages/errors.log; \
false; \
fi
+# )
$i "Check that all applications and their modules can still be loaded"
$t if ! ( cd packages/$1_pkg/ && $(ERL) -pa deps/*/ebin/ -eval " \
@@ -268,4 +401,23 @@ pkg-$1: init
$t rm -rf packages/$1_pkg/)
endef
-$(foreach pkg,$(PACKAGES),$(eval $(call pkg_target,$(pkg))))
+$(foreach pkg,$(shell grep -v '^#' hexpm_packages.txt | sed 's/ /@/'),$(eval $(call hexpm_pkg_target,$(firstword $(subst @, ,$(pkg))),$(lastword $(subst @, ,$(pkg))))))
+
+hexpm-packages: $(addprefix hexpm-pkg-,$(HEXPM_PACKAGES))
+
+endif
+
+# Templates.
+#
+# apps_Makefile, top_Makefile and vm.args are not currently tested here.
+
+templates: clean
+ $i "Compile Erlang modules"
+ $t mkdir test_templates/
+ $t cd test_templates/ && erlc +no_error_module_mismatch ../../templates/*.erl
+
+ $i "Load Erlang term files"
+ $t $(ERL) -eval '{ok, _} = file:consult("../templates/application.app.src"), halt()'
+ $t $(ERL) -eval '{ok, _} = file:consult("../templates/library.app.src"), halt()'
+ $t $(ERL) -eval '{ok, _} = file:consult("../templates/relx.config"), halt()'
+ $t $(ERL) -eval '{ok, _} = file:consult("../templates/sys.config"), halt()'
diff --git a/test/core_app.mk b/test/core_app.mk
index effc598..7c9c046 100644
--- a/test/core_app.mk
+++ b/test/core_app.mk
@@ -1,10 +1,10 @@
# Core: Building applications.
-CORE_APP_TARGETS = $(call list_targets,core-app)
+core_app_TARGETS = $(call list_targets,core-app)
-.PHONY: core-app $(CORE_APP_TARGETS)
+.PHONY: core-app $(core_app_TARGETS)
-core-app: $(CORE_APP_TARGETS)
+core-app: $(core_app_TARGETS)
ifdef LEGACY
core-app-appsrc-change: init
@@ -274,6 +274,59 @@ endif
true = ID =/= [], \
halt()"
+core-app-compile-first: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Generate .erl files"
+ $t echo "-module(boy)." > $(APP)/src/boy.erl
+ $t echo "-module(girl)." > $(APP)/src/girl.erl
+ $t echo "-module(first)." > $(APP)/src/first.erl
+
+ $i "Define COMPILE_FIRST"
+ $t echo "COMPILE_FIRST = first" >> $(APP)/Makefile
+
+ $i "Build the application"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that the application was compiled correctly"
+ $t $(ERL) -pa $(APP)/ebin/ -eval " \
+ ok = application:start($(APP)), \
+ {ok, Mods = [boy, first, girl]} \
+ = application:get_key($(APP), modules), \
+ [{module, M} = code:load_file(M) || M <- Mods], \
+ halt()"
+
+core-app-compile-first-sub-directory: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Generate .erl files"
+ $t echo "-module(boy)." > $(APP)/src/boy.erl
+ $t echo "-module(girl)." > $(APP)/src/girl.erl
+ $t mkdir $(APP)/src/sub/
+ $t echo "-module(first)." > $(APP)/src/sub/first.erl
+
+ $i "Define COMPILE_FIRST with a module in a sub-directory"
+ $t echo "COMPILE_FIRST = sub/first" >> $(APP)/Makefile
+
+ $i "Build the application"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that the application was compiled correctly"
+ $t $(ERL) -pa $(APP)/ebin/ -eval " \
+ ok = application:start($(APP)), \
+ {ok, Mods = [boy, first, girl]} \
+ = application:get_key($(APP), modules), \
+ [{module, M} = code:load_file(M) || M <- Mods], \
+ halt()"
+
ifndef LEGACY
core-app-env: init
@@ -1699,7 +1752,8 @@ core-app-yrl-header: init
$t echo "-export([forty_two/0])." > $(APP)/include/yecc_header.hrl
# A bunch of gobbldygook we don't actually care about, they just
# need to exist so we don't get errors.
- $t echo "-export([yeccpars1/5, yeccerror/1, yeccpars2/7, yeccpars2_0/7, yeccpars2_1/7, yeccpars2_2/7, yeccpars2_3/7, yeccpars2_5/7, yeccpars2_6/7, yeccpars2_7/7, yeccpars2_9/7, yeccpars2_11/7, 'yeccgoto_\'E\''/7, 'yeccgoto_\'F\''/7, 'yeccgoto_\'T\''/7, yeccpars2_9_/1, yeccpars2_11_/1, yeccpars2_7_/1])." >> $(APP)/include/yecc_header.hrl
+ $t echo "-export([yeccpars1/5])." >> $(APP)/include/yecc_header.hrl
+ $t echo "-export([yeccerror/1])." >> $(APP)/include/yecc_header.hrl
$t echo "yeccpars1(_,_,_,_,_) -> throw(not_implemented)." >> $(APP)/include/yecc_header.hrl
$t echo "yeccerror(_) -> throw(not_implemented)." >> $(APP)/include/yecc_header.hrl
# Required bits done, now part we'll actually test for.
diff --git a/test/core_apps.mk b/test/core_apps.mk
index 878bb10..8e2223e 100644
--- a/test/core_apps.mk
+++ b/test/core_apps.mk
@@ -1,10 +1,10 @@
# Core: Multi-applications.
-CORE_APPS_TARGETS = $(call list_targets,core-apps)
+core_apps_TARGETS = $(call list_targets,core-apps)
-.PHONY: core-apps $(CORE_APPS_TARGETS)
+.PHONY: core-apps $(core_apps_TARGETS)
-core-apps: $(CORE_APPS_TARGETS)
+core-apps: $(core_apps_TARGETS)
core-apps-build: init
@@ -444,7 +444,7 @@ core-apps-local-deps: init
$t $(MAKE) -C $(APP) new-app in=my_app_1 $v
$i "Add Lager to the list of dependencies of my_app_1, and add the lager parse_transform"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lager\nERLC_OPTS+=+{parse_transform,lager_transform}\n"}' $(APP)/apps/my_app_1/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lager\ndep_lager = git https://github.com/erlang-lager/lager master\nERLC_OPTS+=+{parse_transform,lager_transform}\n"}' $(APP)/apps/my_app_1/Makefile
$i "Add a lager:error/2 call to my_app_1_app.erl that will fail if the parse_transform doesn't run"
$t perl -ni.bak -e 'print;if (/^-export/){print "\n-export([log/0]).\n"} if (eof) {print "\nlog() -> lager:error(\"test\", []).\n"}' $(APP)/apps/my_app_1/src/my_app_1_app.erl
@@ -477,7 +477,7 @@ core-apps-local-deps: init
$i "Distclean the application"
$t $(MAKE) -C $(APP) distclean $v
- $i "Test after swapping my_app_1 and my_app_2 to make sure lexical ordering didnt incidentally build the correct app first"
+ $i "Test after swapping my_app_1 and my_app_2 to make sure lexical ordering didn't incidentally build the correct app first"
$i "Add my_app_2 to the list of local dependencies of my_app_1, don't add lager, but add the lager parse_transform (this will fail unless my_app_2 was indeed built first)"
$t mv $(APP)/apps/my_app_1/Makefile.bak $(APP)/apps/my_app_1/Makefile
@@ -485,7 +485,7 @@ core-apps-local-deps: init
$i "Add Lager to the list of dependencies of my_app_2, and add the lager parse_transform"
$t mv $(APP)/apps/my_app_2/Makefile.bak $(APP)/apps/my_app_2/Makefile
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lager\nERLC_OPTS+=+{parse_transform,lager_transform}\n"}' $(APP)/apps/my_app_2/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lager\ndep_lager = git https://github.com/erlang-lager/lager master\nERLC_OPTS+=+{parse_transform,lager_transform}\n"}' $(APP)/apps/my_app_2/Makefile
$i "Build the application"
$t $(MAKE) -C $(APP) $v
diff --git a/test/core_autopatch.mk b/test/core_autopatch.mk
index 2624f79..7b64269 100644
--- a/test/core_autopatch.mk
+++ b/test/core_autopatch.mk
@@ -1,10 +1,10 @@
# Core: Autopatch.
-CORE_AUTOPATCH_TARGETS = $(call list_targets,core-autopatch)
+core_autopatch_TARGETS = $(call list_targets,core-autopatch)
-.PHONY: core-autopatch $(CORE_AUTOPATCH_TARGETS)
+.PHONY: core-autopatch $(core_autopatch_TARGETS)
-core-autopatch: $(CORE_AUTOPATCH_TARGETS)
+core-autopatch: $(core_autopatch_TARGETS)
core-autopatch-extended: init
@@ -34,7 +34,7 @@ core-autopatch-extended-erlc-opts: init
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
$i "Add couchbeam to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = couchbeam\n"}' $(APP)/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = couchbeam\ndep_couchbeam = git https://github.com/benoitc/couchbeam master\n"}' $(APP)/Makefile
$i "Extend autopatch-couchbeam to add options to its ERLC_OPTS"
$t echo "autopatch-couchbeam:: ; echo >> \$$(DEPS_DIR)/couchbeam/Makefile; echo 'ERLC_OPTS += -DWITH_JIFFY' >> \$$(DEPS_DIR)/couchbeam/Makefile" >> $(APP)/Makefile
@@ -93,7 +93,7 @@ core-autopatch-no-autopatch-erlang-mk: init
# $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
#
# $i "Add Lager to the list of dependencies and to the NO_AUTOPATCH list"
-# $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lager\nNO_AUTOPATCH = lager\n"}' $(APP)/Makefile
+# $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lager\ndep_lager = git https://github.com/erlang-lager/lager master\nNO_AUTOPATCH = lager\n"}' $(APP)/Makefile
#
# $i "Build the application"
# $t $(MAKE) -C $(APP) $v
@@ -151,7 +151,7 @@ core-autopatch-rebar: init
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
$i "Add erlsha2 to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = erlsha2\n"}' $(APP)/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = erlsha2\ndep_erlsha2 = git https://github.com/vinoski/erlsha2 master\n"}' $(APP)/Makefile
$i "Build the application"
$t $(MAKE) -C $(APP) $v
@@ -163,6 +163,33 @@ ifneq ($(PLATFORM),msys2)
$t test -f $(APP)/deps/erlsha2/priv/erlsha2_nif.so
endif
+core-autopatch-rebar-git_subdir: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Bootstrap application my_dep inside $(APP) that uses rebar"
+ $t mkdir $(APP)/my_dep
+ $t cp ../erlang.mk $(APP)/my_dep/
+ $t $(MAKE) -C $(APP)/my_dep/ -f erlang.mk bootstrap LEGACY=1 $v
+ $t rm $(APP)/my_dep/erlang.mk $(APP)/my_dep/Makefile
+
+ $i "Add a rebar.config file with git_subdir to my_dep"
+ $t echo '{deps, [{eqwalizer_support, {git_subdir, "https://github.com/whatsapp/eqwalizer.git", {branch, "main"}, "eqwalizer_support"}} ]}.' > $(APP)/my_dep/rebar.config
+
+ $i "Add my_dep to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = my_dep\ndep_my_dep = cp $(CURDIR)/$(APP)/my_dep/\n"}' $(APP)/Makefile
+
+ $i "Build the application"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that eqwalizer_support was fetched and built"
+ $t test -d $(APP)/deps/eqwalizer_support
+ $t test -f $(APP)/deps/eqwalizer_support/ebin/eqwalizer.beam
+ $t test -f $(APP)/deps/eqwalizer_support/ebin/eqwalizer_specs.beam
+
# This test is expected to fail when run in parallel and flock/lockf is not available.
core-autopatch-two-rebar: init
@@ -172,7 +199,7 @@ core-autopatch-two-rebar: init
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
$i "Add two Rebar projects to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = epgsql mochiweb\n"}' $(APP)/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = epgsql mochiweb\ndep_epgsql = git https://github.com/epgsql/epgsql devel\ndep_mochiweb = git https://github.com/mochi/mochiweb main\n"}' $(APP)/Makefile
$i "Build the application"
$t $(MAKE) -C $(APP) $v
diff --git a/test/core_compat.mk b/test/core_compat.mk
index d9789ec..c8c570d 100644
--- a/test/core_compat.mk
+++ b/test/core_compat.mk
@@ -2,14 +2,13 @@
#
# Note: autopatch functionality is covered separately.
-CORE_COMPAT_TARGETS = $(call list_targets,core-compat)
+core_compat_TARGETS = $(call list_targets,core-compat)
-REBAR_BINARY = https://github.com/rebar/rebar/releases/download/2.6.0/rebar
REBAR3_BINARY = https://s3.amazonaws.com/rebar3/rebar3
-.PHONY: core-compat $(CORE_COMPAT_TARGETS)
+.PHONY: core-compat $(core_compat_TARGETS)
-core-compat: $(CORE_COMPAT_TARGETS)
+core-compat: $(core_compat_TARGETS)
core-compat-auto-rebar: init
@@ -46,12 +45,12 @@ core-compat-auto-rebar: init
$i "Distclean the application"
$t $(MAKE) -C $(APP) distclean $v
- $i "Download rebar"
- $t curl --retry 5 -s -L -o $(APP)/rebar $(REBAR_BINARY)
- $t chmod +x $(APP)/rebar
+ $i "Download rebar3"
+ $t curl --retry 5 -s -L -o $(APP)/rebar3 $(REBAR3_BINARY)
+ $t chmod +x $(APP)/rebar3
- $i "Use rebar to build the application"
- $t cd $(APP) && ./rebar compile $v
+ $i "Use rebar3 to build the application"
+ $t cd $(APP) && ./rebar3 compile $v
core-compat-rebar: init
@@ -85,14 +84,14 @@ core-compat-rebar: init
$i "Distclean the application"
$t $(MAKE) -C $(APP) distclean $v
- $i "Download rebar"
- $t curl --retry 5 -s -L -o $(APP)/rebar $(REBAR_BINARY)
- $t chmod +x $(APP)/rebar
+ $i "Download rebar3"
+ $t curl --retry 5 -s -L -o $(APP)/rebar3 $(REBAR3_BINARY)
+ $t chmod +x $(APP)/rebar3
- $i "Use rebar to build the application"
- $t cd $(APP) && ./rebar compile $v
+ $i "Use rebar3 to build the application"
+ $t cd $(APP) && ./rebar3 compile $v
-core-compat-rebar-deps-git: init
+core-compat-rebar-deps-git-branch: init
$i "Bootstrap a new OTP library named $(APP)"
$t mkdir $(APP)/
@@ -100,7 +99,7 @@ core-compat-rebar-deps-git: init
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
$i "Add Cowboy as a dependency"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy = git https://github.com/ninenines/cowboy 1.0.0\n"}' $(APP)/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy = git https://github.com/ninenines/cowboy master\n"}' $(APP)/Makefile
$i "Run 'make rebar.config'"
$t $(MAKE) -C $(APP) rebar.config $v
@@ -108,21 +107,85 @@ core-compat-rebar-deps-git: init
$i "Check that rebar.config was created"
$t test -f $(APP)/rebar.config
- $i "Check that Cowboy is listed in rebar.config"
+ $i "Check that Cowboy is listed in rebar.config with a branch"
+ $t $(ERL) -eval " \
+ {ok, C} = file:consult(\"$(APP)/rebar.config\"), \
+ {_, [{cowboy, _, {git, _, {branch, \"master\"}}}]} = lists:keyfind(deps, 1, C), \
+ halt()"
+
+ $i "Distclean the application"
+ $t $(MAKE) -C $(APP) distclean $v
+
+ $i "Download rebar3"
+ $t curl --retry 5 -s -L -o $(APP)/rebar3 $(REBAR3_BINARY)
+ $t chmod +x $(APP)/rebar3
+
+ $i "Use rebar3 to build the application"
+ $t cd $(APP) && ./rebar3 compile $v
+
+core-compat-rebar-deps-git-ref: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Add Cowboy as a dependency"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy = git https://github.com/ninenines/cowboy 7e160b49\n"}' $(APP)/Makefile
+
+ $i "Run 'make rebar.config'"
+ $t $(MAKE) -C $(APP) rebar.config $v
+
+ $i "Check that rebar.config was created"
+ $t test -f $(APP)/rebar.config
+
+ $i "Check that Cowboy is listed in rebar.config with a branch"
$t $(ERL) -eval " \
{ok, C} = file:consult(\"$(APP)/rebar.config\"), \
- {_, [{cowboy, _, {git, _, \"1.0.0\"}}]} = lists:keyfind(deps, 1, C), \
+ {_, [{cowboy, _, {git, _, {ref, \"7e160b49\"}}}]} = lists:keyfind(deps, 1, C), \
halt()"
$i "Distclean the application"
$t $(MAKE) -C $(APP) distclean $v
- $i "Download rebar"
- $t curl --retry 5 -s -L -o $(APP)/rebar $(REBAR_BINARY)
- $t chmod +x $(APP)/rebar
+ $i "Download rebar3"
+ $t curl --retry 5 -s -L -o $(APP)/rebar3 $(REBAR3_BINARY)
+ $t chmod +x $(APP)/rebar3
- $i "Use rebar to build the application"
- $t cd $(APP) && ./rebar get-deps compile $v
+ $i "Use rebar3 to build the application"
+ $t cd $(APP) && ./rebar3 compile $v
+
+core-compat-rebar-deps-git-tag: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Add Cowboy as a dependency"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy = git https://github.com/ninenines/cowboy 2.9.0\n"}' $(APP)/Makefile
+
+ $i "Run 'make rebar.config'"
+ $t $(MAKE) -C $(APP) rebar.config $v
+
+ $i "Check that rebar.config was created"
+ $t test -f $(APP)/rebar.config
+
+ $i "Check that Cowboy is listed in rebar.config with a tag"
+ $t $(ERL) -eval " \
+ {ok, C} = file:consult(\"$(APP)/rebar.config\"), \
+ {_, [{cowboy, _, {git, _, {tag, \"2.9.0\"}}}]} = lists:keyfind(deps, 1, C), \
+ halt()"
+
+ $i "Distclean the application"
+ $t $(MAKE) -C $(APP) distclean $v
+
+ $i "Download rebar3"
+ $t curl --retry 5 -s -L -o $(APP)/rebar3 $(REBAR3_BINARY)
+ $t chmod +x $(APP)/rebar3
+
+ $i "Use rebar3 to build the application"
+ $t cd $(APP) && ./rebar3 compile $v
core-compat-rebar-deps-hex: init
@@ -132,7 +195,7 @@ core-compat-rebar-deps-hex: init
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
$i "Add Cowboy as a dependency"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy = hex 1.0.0\n"}' $(APP)/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy = hex 2.12.0\n"}' $(APP)/Makefile
$i "Run 'make rebar.config'"
$t $(MAKE) -C $(APP) rebar.config $v
@@ -143,7 +206,7 @@ core-compat-rebar-deps-hex: init
$i "Check that Cowboy is listed in rebar.config"
$t $(ERL) -eval " \
{ok, C} = file:consult(\"$(APP)/rebar.config\"), \
- {_, [{cowboy, \"1.0.0\"}]} = lists:keyfind(deps, 1, C), \
+ {_, [{cowboy, \"2.12.0\"}]} = lists:keyfind(deps, 1, C), \
halt()"
$i "Distclean the application"
@@ -153,7 +216,7 @@ core-compat-rebar-deps-hex: init
$t curl --retry 5 -s -L -o $(APP)/rebar3 $(REBAR3_BINARY)
$t chmod +x $(APP)/rebar3
- $i "Use rebar to build the application"
+ $i "Use rebar3 to build the application"
$t cd $(APP) && ./rebar3 compile $v
core-compat-rebar-deps-pkg: init
@@ -175,18 +238,18 @@ core-compat-rebar-deps-pkg: init
$i "Check that Cowboy is listed in rebar.config"
$t $(ERL) -eval " \
{ok, C} = file:consult(\"$(APP)/rebar.config\"), \
- {_, [{cowboy, _, {git, \"https://github.com/\" ++ _, _}}]} = lists:keyfind(deps, 1, C), \
+ {_, [{cowboy, _, {git, \"https://github.com/\" ++ _, {branch, _}}}]} = lists:keyfind(deps, 1, C), \
halt()"
$i "Distclean the application"
$t $(MAKE) -C $(APP) distclean $v
- $i "Download rebar"
- $t curl --retry 5 -s -L -o $(APP)/rebar $(REBAR_BINARY)
- $t chmod +x $(APP)/rebar
+ $i "Download rebar3"
+ $t curl --retry 5 -s -L -o $(APP)/rebar3 $(REBAR3_BINARY)
+ $t chmod +x $(APP)/rebar3
- $i "Use rebar to build the application"
- $t cd $(APP) && ./rebar get-deps compile $v
+ $i "Use rebar3 to build the application"
+ $t cd $(APP) && ./rebar3 compile $v
core-compat-rebar-erlc-opts: init
@@ -230,12 +293,12 @@ core-compat-rebar-erlc-opts: init
$i "Distclean the application"
$t $(MAKE) -C $(APP) distclean $v
- $i "Download rebar"
- $t curl --retry 5 -s -L -o $(APP)/rebar $(REBAR_BINARY)
- $t chmod +x $(APP)/rebar
+ $i "Download rebar3"
+ $t curl --retry 5 -s -L -o $(APP)/rebar3 $(REBAR3_BINARY)
+ $t chmod +x $(APP)/rebar3
- $i "Use rebar to build the application"
- $t cd $(APP) && ./rebar compile $v
+ $i "Use rebar3 to build the application"
+ $t cd $(APP) && ./rebar3 compile $v
core-compat-rebar-pt: init
@@ -249,7 +312,7 @@ core-compat-rebar-pt: init
$t echo "-module(girl)." > $(APP)/src/girl.erl
$i "Add lager to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lager\n"}' $(APP)/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lager\ndep_lager = git https://github.com/erlang-lager/lager master\n"}' $(APP)/Makefile
$i "Add the lager_transform parse_transform to ERLC_OPTS"
$t echo "ERLC_OPTS += +'{parse_transform, lager_transform}' +'{lager_truncation_size, 1234}'" >> $(APP)/Makefile
@@ -288,14 +351,14 @@ ifndef LEGACY
$t mv $(APP)/$(APP).app $(APP)/ebin/
endif
- $i "Download rebar"
- $t curl --retry 5 -s -L -o $(APP)/rebar $(REBAR_BINARY)
- $t chmod +x $(APP)/rebar
+ $i "Download rebar3"
+ $t curl --retry 5 -s -L -o $(APP)/rebar3 $(REBAR3_BINARY)
+ $t chmod +x $(APP)/rebar3
- $i "Use rebar to build the application"
- $t cd $(APP) && ./rebar get-deps compile $v
+ $i "Use rebar3 to build the application"
+ $t cd $(APP) && ./rebar3 compile $v
$i "Check that all compiled files exist"
- $t test -f $(APP)/ebin/$(APP).app
- $t test -f $(APP)/ebin/boy.beam
- $t test -f $(APP)/ebin/girl.beam
+ $t test -f $(APP)/_build/default/lib/$(APP)/ebin/$(APP).app
+ $t test -f $(APP)/_build/default/lib/$(APP)/ebin/boy.beam
+ $t test -f $(APP)/_build/default/lib/$(APP)/ebin/girl.beam
diff --git a/test/core_deps.mk b/test/core_deps.mk
index 973ff5d..dd052e5 100644
--- a/test/core_deps.mk
+++ b/test/core_deps.mk
@@ -1,10 +1,10 @@
# Core: Packages and dependencies.
-CORE_DEPS_TARGETS = $(call list_targets,core-deps)
+core_deps_TARGETS = $(call list_targets,core-deps)
-.PHONY: core-deps $(CORE_DEPS_TARGETS)
+.PHONY: core-deps $(core_deps_TARGETS)
-core-deps: $(CORE_DEPS_TARGETS)
+core-deps: $(core_deps_TARGETS)
ifneq ($(PLATFORM),msys2)
core-deps-build-c-8cc: init
@@ -106,6 +106,119 @@ core-deps-build-js: init
false = lists:member(jquery, Deps), \
halt()"
+core-deps-cache-git: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Add Cowlib to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\n"}' $(APP)/Makefile
+
+ $i "Add CACHE_DEPS = 1 to the Makefile"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "CACHE_DEPS = 1\n"}' $(APP)/Makefile
+
+ $i "Check that the cache doesn't exist yet"
+ $t test ! -d $(CACHE_DIR)
+
+ $i "Build the dependencies"
+ $t $(MAKE) -C $(APP) deps $v
+
+ $i "Check that the cache has been created"
+ $t test -d $(CACHE_DIR)
+
+ $i "Check that Cowlib was cloned in the cache"
+ $t test -d $(CACHE_DIR)/git/cowlib
+
+ $i "Distclean the application"
+ $t $(MAKE) -C $(APP) distclean $v
+
+ $i "Check that Cowlib is still in the cache"
+ $t test -d $(CACHE_DIR)/git/cowlib
+
+ $i "Break the Cowlib git link so we're forced to use the cache"
+ $t echo 'dep_cowlib = git bad_url master' >> $(APP)/Makefile
+
+ $i "Build the dependencies"
+ $t $(MAKE) -C $(APP) deps $v
+
+core-deps-cache-git-reuse: init
+
+ $i "Bootstrap a new OTP library named $(APP)_1"
+ $t mkdir $(APP)_1/
+ $t cp ../erlang.mk $(APP)_1/
+ $t $(MAKE) -C $(APP)_1 -f erlang.mk bootstrap-lib $v
+
+ $i "Add Cowlib 1.0.0 to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\ndep_cowlib = git \$$(pkg_cowlib_repo) 1.0.0\n"}' $(APP)_1/Makefile
+
+ $i "Add CACHE_DEPS = 1 to the Makefile"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "CACHE_DEPS = 1\n"}' $(APP)_1/Makefile
+
+ $i "Bootstrap a new OTP library named $(APP)_2"
+ $t mkdir $(APP)_2/
+ $t cp ../erlang.mk $(APP)_2/
+ $t $(MAKE) -C $(APP)_2 -f erlang.mk bootstrap-lib $v
+
+ $i "Add Cowlib 2.0.0 to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\ndep_cowlib = git \$$(pkg_cowlib_repo) 2.0.0\n"}' $(APP)_2/Makefile
+
+ $i "Add CACHE_DEPS = 1 to the Makefile"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "CACHE_DEPS = 1\n"}' $(APP)_2/Makefile
+
+ $i "Build the dependencies in $(APP)_1"
+ $t $(MAKE) -C $(APP)_1 deps $v
+
+ $i "Check that the cache has been created"
+ $t test -d $(CACHE_DIR)
+
+ $i "Check that Cowlib was cloned in the cache"
+ $t test -d $(CACHE_DIR)/git/cowlib
+
+ $i "Build the dependencies in $(APP)_2"
+ $t $(MAKE) -C $(APP)_2 deps $v
+
+ $i "Check that $(APP)_1 cloned Cowlib 1.0.0"
+ $t test "$$(cat $(APP)_1/deps/cowlib/.git/HEAD)" = "d544a494af4dbc810fc9c15eaf5cc050cced1501"
+
+ $i "Check that $(APP)_2 cloned Cowlib 2.0.0"
+ $t test "$$(cat $(APP)_2/deps/cowlib/.git/HEAD)" = "bd37be4d3b065600c3b76b492535e76e5d413fc1"
+
+core-deps-cache-hex: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Add Cowlib to the list of dependencies using Hex"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\ndep_cowlib = hex 2.12.1\n"}' $(APP)/Makefile
+
+ $i "Add CACHE_DEPS = 1 to the Makefile"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "CACHE_DEPS = 1\n"}' $(APP)/Makefile
+
+ $i "Check that the cache doesn't exist yet"
+ $t test ! -d $(CACHE_DIR)
+
+ $i "Build the dependencies"
+ $t $(MAKE) -C $(APP) deps $v
+
+ $i "Check that the cache has been created"
+ $t test -d $(CACHE_DIR)
+
+ $i "Check that Cowlib was cloned in the cache"
+ $t test -f $(CACHE_DIR)/hex/cowlib-2.12.1.tar
+
+ $i "Distclean the application"
+ $t $(MAKE) -C $(APP) distclean $v
+
+ $i "Check that Cowlib is still in the cache"
+ $t test -f $(CACHE_DIR)/hex/cowlib-2.12.1.tar
+
+ $i "Build the dependencies"
+ $t $(MAKE) -C $(APP) deps $v
+
core-deps-dep-built: init
$i "Bootstrap a new OTP library named $(APP)"
@@ -288,8 +401,8 @@ core-deps-dep-commit: init
$t cp ../erlang.mk $(APP)/
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
- $i "Add Cowboy 1.0.0 to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy_commit = 1.0.0\n"}' $(APP)/Makefile
+ $i "Add Cowboy 2.12.0 to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy_commit = 2.12.0\n"}' $(APP)/Makefile
ifdef LEGACY
$i "Add Cowboy to the applications key in the .app.src file"
@@ -309,7 +422,7 @@ endif
[ok = application:load(App) || App <- [$(APP), cowboy, cowlib, ranch]], \
{ok, Deps} = application:get_key($(APP), applications), \
true = lists:member(cowboy, Deps), \
- {ok, \"1.0.0\"} = application:get_key(cowboy, vsn), \
+ {ok, \"2.12.0\"} = application:get_key(cowboy, vsn), \
halt()"
core-deps-dir: init
@@ -354,7 +467,7 @@ core-deps-doc: init
$t echo "-module(girl)." > $(APP)/src/girl.erl
$i "Add Edown as a documentation building dependency"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DOC_DEPS = edown\nEDOC_OPTS = {doclet, edown_doclet}\n"}' $(APP)/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DOC_DEPS = edown\ndep_edown = git https://github.com/uwiger/edown master\nEDOC_OPTS = {doclet, edown_doclet}\n"}' $(APP)/Makefile
$i "Build the application"
$t $(MAKE) -C $(APP) $v
@@ -473,8 +586,8 @@ core-deps-fetch-git: init
$t cp ../erlang.mk $(APP)/
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
- $i "Add Cowboy 1.0.0 to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy = git https://github.com/ninenines/cowboy 1.0.0\n"}' $(APP)/Makefile
+ $i "Add Cowboy 2.12.0 to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy_commit = 2.12.0\n"}' $(APP)/Makefile
ifdef LEGACY
$i "Add Cowboy to the applications key in the .app.src file"
@@ -494,7 +607,7 @@ endif
[ok = application:load(App) || App <- [$(APP), cowboy, cowlib, ranch]], \
{ok, Deps} = application:get_key($(APP), applications), \
true = lists:member(cowboy, Deps), \
- {ok, \"1.0.0\"} = application:get_key(cowboy, vsn), \
+ {ok, \"2.12.0\"} = application:get_key(cowboy, vsn), \
halt()"
core-deps-fetch-git-subfolder: init
@@ -562,7 +675,7 @@ core-deps-fetch-git-submodule: init
$t mkdir $(APP)/deps
$t cd $(APP) && \
git init -q && \
- git submodule -q add file://$(abspath $(APP)/my_dep) deps/my_dep && \
+ git -c protocol.file.allow=always submodule -q add file://$(abspath $(APP)/my_dep) deps/my_dep && \
git config user.email "[email protected]" && \
git config user.name "test suite" && \
git add . && \
@@ -599,12 +712,12 @@ core-deps-fetch-hex: init
$t cp ../erlang.mk $(APP)/
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
- $i "Add Cowboy 1.0.0 to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy = hex 1.0.0\n"}' $(APP)/Makefile
+ $i "Add Cowboy 2.12.0 and SystemD 0.6.0 to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy systemd\ndep_cowboy = hex 2.12.0\ndep_systemd = hex 0.6.0\n"}' $(APP)/Makefile
ifdef LEGACY
- $i "Add Cowboy to the applications key in the .app.src file"
- $t perl -ni.bak -e 'print;if ($$.==7) {print "\t\tcowboy,\n"}' $(APP)/src/$(APP).app.src
+ $i "Add Cowboy and SystemD to the applications key in the .app.src file"
+ $t perl -ni.bak -e 'print;if ($$.==7) {print "\t\tcowboy,\n\t\tsystemd,\n"}' $(APP)/src/$(APP).app.src
endif
$i "Build the application"
@@ -614,13 +727,17 @@ endif
$t test -d $(APP)/deps/cowboy
$t test -d $(APP)/deps/cowlib
$t test -d $(APP)/deps/ranch
+ $t test -d $(APP)/deps/systemd
+ $t test -d $(APP)/deps/enough
$i "Check that the application was compiled correctly"
$t $(ERL) -pa $(APP)/ebin/ $(APP)/deps/*/ebin/ -eval " \
- [ok = application:load(App) || App <- [$(APP), cowboy, cowlib, ranch]], \
+ [ok = application:load(App) || App <- [$(APP), cowboy, cowlib, ranch, systemd, enough]], \
{ok, Deps} = application:get_key($(APP), applications), \
true = lists:member(cowboy, Deps), \
- {ok, \"1.0.0\"} = application:get_key(cowboy, vsn), \
+ true = lists:member(systemd, Deps), \
+ {ok, \"2.12.0\"} = application:get_key(cowboy, vsn), \
+ {ok, \"0.6.0\"} = application:get_key(systemd, vsn), \
halt()"
# @todo Enable this test again when a host provides Mercurial again.
@@ -653,23 +770,6 @@ endif
# {ok, \"4.0.3\"} = application:get_key(ehsa, vsn), \
# halt()"
-# Legacy must fail for the top-level application, but work for dependencies.
-core-deps-fetch-legacy: init
-
- $i "Bootstrap a new OTP library named $(APP)"
- $t mkdir $(APP)/
- $t cp ../erlang.mk $(APP)/
- $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
-
- $i "Add Cowlib as a dependency using a non-existing fetch method named oops"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\ndep_cowlib = https://github.com/ninenines/cowlib 1.0.0\n"}' $(APP)/Makefile
-
- $i "Check that building the application fails"
- $t ! $(MAKE) -C $(APP) $v
-
- $i "Check that building the application works with IS_DEP=1"
- $t $(MAKE) -C $(APP) IS_DEP=1 $v
-
core-deps-fetch-ln: init
$i "Bootstrap a new OTP library named $(APP)"
@@ -703,34 +803,35 @@ endif
true = lists:member(my_dep, Deps), \
halt()"
-core-deps-fetch-svn: init
-
- $i "Bootstrap a new OTP library named $(APP)"
- $t mkdir $(APP)/
- $t cp ../erlang.mk $(APP)/
- $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
-
- $i "Add Cowlib 1.0.0 to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\ndep_cowlib = svn https://github.com/ninenines/cowlib/tags/1.0.0\n"}' $(APP)/Makefile
-
-ifdef LEGACY
- $i "Add Cowlib to the applications key in the .app.src file"
- $t perl -ni.bak -e 'print;if ($$.==7) {print "\t\tcowlib,\n"}' $(APP)/src/$(APP).app.src
-endif
-
- $i "Build the application"
- $t $(MAKE) -C $(APP) $v
-
- $i "Check that all dependencies were fetched"
- $t test -d $(APP)/deps/cowlib
-
- $i "Check that the application was compiled correctly"
- $t $(ERL) -pa $(APP)/ebin/ $(APP)/deps/*/ebin/ -eval " \
- [ok = application:load(App) || App <- [$(APP), cowlib]], \
- {ok, Deps} = application:get_key($(APP), applications), \
- true = lists:member(cowlib, Deps), \
- {ok, \"1.0.0\"} = application:get_key(cowlib, vsn), \
- halt()"
+# @todo Enable this test again when a host provides Subversion again.
+#core-deps-fetch-svn: init
+#
+# $i "Bootstrap a new OTP library named $(APP)"
+# $t mkdir $(APP)/
+# $t cp ../erlang.mk $(APP)/
+# $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+#
+# $i "Add Cowlib 1.0.0 to the list of dependencies"
+# $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\ndep_cowlib = svn https://github.com/ninenines/cowlib/tags/1.0.0\n"}' $(APP)/Makefile
+#
+#ifdef LEGACY
+# $i "Add Cowlib to the applications key in the .app.src file"
+# $t perl -ni.bak -e 'print;if ($$.==7) {print "\t\tcowlib,\n"}' $(APP)/src/$(APP).app.src
+#endif
+#
+# $i "Build the application"
+# $t $(MAKE) -C $(APP) $v
+#
+# $i "Check that all dependencies were fetched"
+# $t test -d $(APP)/deps/cowlib
+#
+# $i "Check that the application was compiled correctly"
+# $t $(ERL) -pa $(APP)/ebin/ $(APP)/deps/*/ebin/ -eval " \
+# [ok = application:load(App) || App <- [$(APP), cowlib]], \
+# {ok, Deps} = application:get_key($(APP), applications), \
+# true = lists:member(cowlib, Deps), \
+# {ok, \"1.0.0\"} = application:get_key(cowlib, vsn), \
+# halt()"
core-deps-ignore: init
@@ -1105,7 +1206,7 @@ core-deps-mv-rebar: init
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
$i "Add Lager to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lager\n"}' $(APP)/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lager\ndep_lager = git https://github.com/erlang-lager/lager master\n"}' $(APP)/Makefile
$i "Build the application"
$t $(MAKE) -C $(APP) $v
@@ -1120,6 +1221,32 @@ core-deps-mv-rebar: init
$i "Build the application"
$t $(MAKE) -C $(APP)-moved $v
+ifndef LEGACY
+core-deps-optional: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Add quicer to the list of optional dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "OPTIONAL_DEPS = quicer\n"}' $(APP)/Makefile
+
+ $i "Build the application"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that no dependencies were fetched"
+ $t test ! -e $(APP)/deps
+
+ $i "Check that the application was compiled correctly"
+ $t $(ERL) -pa $(APP)/ebin/ -eval " \
+ ok = application:start($(APP)), \
+ {ok, Deps} = application:get_key($(APP), applications), \
+ true = lists:member(quicer, Deps), \
+ {ok, [quicer]} = application:get_key($(APP), optional_applications), \
+ halt()"
+endif
+
# A lower-level dependency of the first dependency always
# wins over a lower-level dependency of the second dependency.
core-deps-order-first: init
@@ -1137,8 +1264,8 @@ core-deps-order-first: init
$t cp ../erlang.mk $(APP)/my_dep/
$t $(MAKE) -C $(APP)/my_dep/ -f erlang.mk bootstrap-lib $v
- $i "Add Cowlib 1.0.0 to the list of dependencies for my_dep"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\ndep_cowlib = git https://github.com/ninenines/cowlib 1.0.0\n"}' $(APP)/my_dep/Makefile
+ $i "Add Cowlib 2.0.0 to the list of dependencies for my_dep"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\ndep_cowlib = git https://github.com/ninenines/cowlib 2.0.0\n"}' $(APP)/my_dep/Makefile
ifdef LEGACY
$i "Add Cowboy and my_dep to the applications key in the .app.src file"
@@ -1159,7 +1286,7 @@ endif
[ok = application:load(App) || App <- [$(APP), cowboy, cowlib, my_dep, ranch]], \
{ok, Deps} = application:get_key($(APP), applications), \
true = lists:member(cowboy, Deps), \
- {ok, \"1.0.0\"} = application:get_key(cowlib, vsn), \
+ {ok, \"2.0.0\"} = application:get_key(cowlib, vsn), \
halt()"
# A higher-level dependency always wins.
@@ -1170,8 +1297,8 @@ core-deps-order-top: init
$t cp ../erlang.mk $(APP)/
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
- $i "Add Cowboy package and Cowlib 1.0.0 to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy cowlib\ndep_cowlib = git https://github.com/ninenines/cowlib 1.0.0\n"}' $(APP)/Makefile
+ $i "Add Cowboy package and Cowlib 2.0.0 to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy cowlib\ndep_cowlib = git https://github.com/ninenines/cowlib 2.0.0\n"}' $(APP)/Makefile
ifdef LEGACY
$i "Add Cowboy to the applications key in the .app.src file"
@@ -1191,7 +1318,7 @@ endif
[ok = application:load(App) || App <- [$(APP), cowboy, cowlib, ranch]], \
{ok, Deps} = application:get_key($(APP), applications), \
true = lists:member(cowboy, Deps), \
- {ok, \"1.0.0\"} = application:get_key(cowlib, vsn), \
+ {ok, \"2.0.0\"} = application:get_key(cowlib, vsn), \
halt()"
ifndef LEGACY
@@ -1257,7 +1384,7 @@ core-deps-rel: init
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib bootstrap-rel $v
$i "Add Recon to the list of release dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "REL_DEPS = recon\n"}' $(APP)/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "REL_DEPS = recon\ndep_recon = git https://github.com/ferd/recon master\n"}' $(APP)/Makefile
$i "Add Recon to the relx.config file"
$t $(ERL) -eval " \
@@ -1270,8 +1397,8 @@ core-deps-rel: init
$i "Build the application and its dependencies"
$t $(MAKE) -C $(APP) deps app $v
- $i "Check that no dependencies were fetched"
- $t test ! -e $(APP)/deps
+ $i "Check that Recon was not fetched"
+ $t test ! -e $(APP)/deps/recon
$i "Check that the application was compiled correctly"
$t $(ERL) -pa $(APP)/ebin/ -eval " \
@@ -1283,7 +1410,7 @@ core-deps-rel: init
$i "Build the release"
$t $(MAKE) -C $(APP) $v
- $i "Check that all dependencies were fetched"
+ $i "Check that Recon was fetched"
$t test -d $(APP)/deps/recon
$i "Check that the application was compiled correctly"
@@ -1298,17 +1425,17 @@ core-deps-rel: init
ifeq ($(PLATFORM),msys2)
# $t $(APP)/_rel/$(APP)_release/bin/$(APP)_release.cmd install $v
# $t $(APP)/_rel/$(APP)_release/bin/$(APP)_release.cmd start $v
-# $t test -n "`$(APP)/_rel/$(APP)_release/bin/$(APP)_release.cmd rpcterms \
+# $t test -n "`$(APP)/_rel/$(APP)_release/bin/$(APP)_release.cmd rpc \
# application loaded_applications | grep recon`"
# $t $(APP)/_rel/$(APP)_release/bin/$(APP)_release.cmd stop $v
# $t $(APP)/_rel/$(APP)_release/bin/$(APP)_release.cmd uninstall $v
else
$i "Start the release and check that Recon is loaded"
- $t $(APP)/_rel/$(APP)_release/bin/$(APP)_release start $v
+ $t $(APP)/_rel/$(APP)_release/bin/$(APP)_release daemon $v
$t apps="Node is not running!"; \
while test "$$apps" = "Node is not running!"; do \
apps=$$($(APP)/_rel/$(APP)_release/bin/$(APP)_release \
- rpcterms \ application loaded_applications); \
+ rpc application loaded_applications); \
done; \
echo "$$apps" | grep -q recon
$t $(APP)/_rel/$(APP)_release/bin/$(APP)_release stop $v
diff --git a/test/core_elixir.mk b/test/core_elixir.mk
new file mode 100644
index 0000000..c2cec70
--- /dev/null
+++ b/test/core_elixir.mk
@@ -0,0 +1,326 @@
+# Core: Miscellaneous.
+#
+# The miscellaneous tests use the prefix "core-", not "core-misc-".
+
+CORE_ELIXIR_TARGETS = $(call list_targets,core-elixir)
+
+.PHONY: core-elixir $(CORE_ELIXIR_TARGETS)
+
+core-elixir: $(CORE_ELIXIR_TARGETS)
+
+core-elixir-compile-from-lib: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Create Elixir source file hello.ex"
+ $t mkdir $(APP)/lib
+ $t printf "%s\n" \
+ "defmodule HelloWorld do" \
+ " def hello do" \
+ ' IO.puts("Hello, world!")' \
+ " end" \
+ "end" > $(APP)/lib/hello.ex
+
+ $i "Build the application"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that all compiled files exist"
+ $t test -f $(APP)/ebin/$(APP).app
+ $t test -f $(APP)/ebin/Elixir.HelloWorld.beam
+
+ $i "Check that the application was compiled correctly"
+ $t $(ERL) -pa $(APP)/ebin/ -pa $(APP)/deps/*/ebin -pa $(dir $(shell elixir -e 'IO.puts(:code.lib_dir(:elixir))'))/*/ebin -eval " \
+ ok = application:start($(APP)), \
+ {ok, Mods = ['Elixir.HelloWorld']} \
+ = application:get_key($(APP), modules), \
+ [{module, M} = code:load_file(M) || M <- Mods], \
+ halt()"
+
+core-elixir-compile-from-src: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Create Elixir source file hello.ex"
+ $t printf "%s\n" \
+ "defmodule HelloWorld do" \
+ " def hello do" \
+ ' IO.puts("Hello, world!")' \
+ " end" \
+ "end" > $(APP)/src/hello.ex
+
+ $i "Build the application"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that all compiled files exist"
+ $t test -f $(APP)/ebin/$(APP).app
+ $t test -f $(APP)/ebin/Elixir.HelloWorld.beam
+
+ $i "Check that the application was compiled correctly"
+ $t $(ERL) -pa $(APP)/ebin/ -pa $(APP)/deps/*/ebin -pa $(dir $(shell elixir -e 'IO.puts(:code.lib_dir(:elixir))'))/*/ebin -eval " \
+ ok = application:start($(APP)), \
+ {ok, Mods = ['Elixir.HelloWorld']} \
+ = application:get_key($(APP), modules), \
+ [{module, M} = code:load_file(M) || M <- Mods], \
+ halt()"
+
+core-elixir-disable: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Create Elixir source file hello.ex"
+ $t printf "%s\n" \
+ "defmodule HelloWorld do" \
+ " def hello do" \
+ ' IO.puts("Hello, world!")' \
+ " end" \
+ "end" > $(APP)/src/hello.ex
+
+ $i "Disable Elixir in the Makefile"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "ELIXIR = disable\n"}' $(APP)/Makefile
+
+ $i "Build the application"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that the Elixir file wasn't compiled"
+ $t test -f $(APP)/ebin/$(APP).app
+ $t test ! -e $(APP)/ebin/Elixir.HelloWorld.beam
+
+ $i "Check that the application was compiled correctly"
+ $t $(ERL) -pa $(APP)/ebin/ -pa $(APP)/deps/*/ebin -pa $(dir $(shell elixir -e 'IO.puts(:code.lib_dir(:elixir))'))/*/ebin -eval " \
+ ok = application:start($(APP)), \
+ {ok, Mods = []} \
+ = application:get_key($(APP), modules), \
+ halt()"
+
+core-elixir-disable-autopatch-fail: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Add Jason to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = jason\ndep_jason = git https://github.com/michalmuskala/jason.git master\n"}' $(APP)/Makefile
+
+ $i "Disable Elixir in the Makefile"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "ELIXIR = disable\n"}' $(APP)/Makefile
+
+ $i "Building the application should fail"
+ $t ! $(MAKE) -C $(APP) $v
+
+core-elixir-disable-autopatch-erlang-mk: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Add Jose to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = jose\ndep_jose = git https://github.com/potatosalad/erlang-jose main\n"}' $(APP)/Makefile
+
+ $i "Disable Elixir in the Makefile"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "ELIXIR = disable\n"}' $(APP)/Makefile
+
+ $i "Building the application should work as Jose is Erlang.mk-compatible"
+ $t $(MAKE) -C $(APP) $v
+
+core-elixir-disable-autopatch-make: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Add Reloader to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = reloader\ndep_reloader = git https://github.com/2600hz/erlang-reloader de1e6c74204b61ccf3b3652f05c6a7dec9e8257d\n"}' $(APP)/Makefile
+
+ $i "Disable Elixir in the Makefile"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "ELIXIR = disable\n"}' $(APP)/Makefile
+
+ $i "Building the application should work as Reloader contains a proper Makefile"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Confirm Reloader was built"
+ $t test -f $(APP)/deps/reloader/ebin/dep_built
+ $t test -f $(APP)/deps/reloader/ebin/reloader.app
+ $t test -f $(APP)/deps/reloader/ebin/reloader.beam
+
+core-elixir-disable-autopatch-rebar3: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Add OpenTelemetry_API to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = opentelemetry_api\ndep_opentelemetry_api = hex 1.3.0\n"}' $(APP)/Makefile
+
+ $i "Disable Elixir in the Makefile"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "ELIXIR = disable\n"}' $(APP)/Makefile
+
+ $i "Building the application should work as OpenTelemetry_API is Rebar3-compatible"
+ $t $(MAKE) -C $(APP) $v
+
+core-elixir-disable-by-default-autopatch-rebar3: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Add OpenTelemetry_API to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = opentelemetry_api\ndep_opentelemetry_api = hex 1.3.0\n"}' $(APP)/Makefile
+
+ $i "Building the application should work as OpenTelemetry_API is Rebar3-compatible"
+ $t $(MAKE) -C $(APP) $v
+
+core-elixir-from-dep: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Add Elixir, Lager, Jason, Phoenix to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = elixir lager jason phoenix\ndep_elixir_commit = v1.17.3\ndep_lager = git https://github.com/erlang-lager/lager master\ndep_jason = git https://github.com/michalmuskala/jason.git master\ndep_phoenix = hex 1.7.2\n"}' $(APP)/Makefile
+
+ $i "Add the lager_transform parse_transform to ERLC_OPTS"
+ $t echo "ERLC_OPTS += +'{parse_transform, lager_transform}'" >> $(APP)/Makefile
+
+ifdef LEGACY
+ $i "Add Elixir, Lager, Jason and Phoenix to the applications key in the .app.src file"
+ $t perl -ni.bak -e 'print;if ($$.==7) {print "\t\telixir,\n\t\tlager,\n\t\tjason,\n\t\tphoenix,\n"}' $(APP)/src/$(APP).app.src
+endif
+
+ $i "Build the application"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that all dependencies were fetched and built"
+ $t test -f $(APP)/deps/elixir/ebin/dep_built
+ $t test -f $(APP)/deps/lager/ebin/dep_built
+ $t test -f $(APP)/deps/jason/ebin/dep_built
+ $t test -f $(APP)/deps/phoenix/ebin/dep_built
+
+ $i "Check that the application was compiled correctly"
+ $t cd $(APP); $(ERL) -pa ebin/ -pa deps/*/ebin -pa deps/elixir/lib/*/ebin -eval " \
+ {ok, Apps} = application:ensure_all_started('$(APP)'), \
+ true = lists:member(elixir, Apps), \
+ true = lists:member(lager, Apps), \
+ true = lists:member(jason, Apps), \
+ true = lists:member(phoenix, Apps), \
+ halt()"
+
+ $i "Check that the Jason application depends on Elixir builtins"
+ $t cd $(APP); $(ERL) -pa ebin/ -pa deps/*/ebin -pa deps/elixir/lib/*/ebin -eval " \
+ {ok, Apps} = application:ensure_all_started(jason), \
+ true = lists:member(elixir, Apps), \
+ true = lists:member(eex, Apps), \
+ true = lists:member(logger, Apps), \
+ true = lists:member(mix, Apps), \
+ halt()"
+
+core-elixir-from-system: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Add Lager, Jason, Phoenix to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lager jason phoenix\ndep_lager = git https://github.com/erlang-lager/lager master\ndep_jason = git https://github.com/michalmuskala/jason.git master\ndep_phoenix = hex 1.7.2\nELIXIR = system\n"}' $(APP)/Makefile
+
+ $i "Add the lager_transform parse_transform to ERLC_OPTS"
+ $t echo "ERLC_OPTS += +'{parse_transform, lager_transform}'" >> $(APP)/Makefile
+
+ifdef LEGACY
+ $i "Add Lager, Jason and Phoenix to the applications key in the .app.src file"
+ $t perl -ni.bak -e 'print;if ($$.==7) {print "\t\telixir,\n\t\tlager,\n\t\tjason,\n\t\tphoenix,\n"}' $(APP)/src/$(APP).app.src
+endif
+
+ $i "Build the application"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that all dependencies were fetched and built"
+ $t ! test -e $(APP)/deps/elixir
+ $t test -f $(APP)/deps/lager/ebin/dep_built
+ $t test -f $(APP)/deps/jason/ebin/dep_built
+ $t test -f $(APP)/deps/phoenix/ebin/dep_built
+
+ $i "Check that the application was compiled correctly"
+ $t cd $(APP); $(ERL) -pa ebin/ -pa deps/*/ebin -pa $(dir $(shell elixir -e 'IO.puts(:code.lib_dir(:elixir))'))/*/ebin -eval " \
+ {ok, Apps} = application:ensure_all_started('$(APP)'), \
+ true = lists:member(lager, Apps), \
+ true = lists:member(jason, Apps), \
+ true = lists:member(phoenix, Apps), \
+ halt()"
+
+ $i "Check that the Jason application depends on Elixir builtins"
+ $t cd $(APP); $(ERL) -pa ebin/ -pa deps/*/ebin -pa $(dir $(shell elixir -e 'IO.puts(:code.lib_dir(:elixir))'))/*/ebin -eval " \
+ {ok, Apps} = application:ensure_all_started(jason), \
+ true = lists:member(elixir, Apps), \
+ true = lists:member(eex, Apps), \
+ true = lists:member(logger, Apps), \
+ true = lists:member(mix, Apps), \
+ halt()"
+
+core-elixir-nif: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Add Libsalty2 to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = libsalty2\ndep_libsalty2 = git https://github.com/Ianleeclark/libsalty2.git b11e544\nELIXIR = system\n"}' $(APP)/Makefile
+
+ifdef LEGACY
+ $i "Add Libsalty2 to the applications key in the .app.src file"
+ $t perl -ni.bak -e 'print;if ($$.==7) {print "\t\tlibsalty2,\n"}' $(APP)/src/$(APP).app.src
+endif
+
+ $i "Build the application"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that the application was compiled correctly"
+ $t $(ERL) -pa $(APP)/ebin/ -pa $(APP)/deps/*/ebin -pa $(dir $(shell elixir -e 'IO.puts(:code.lib_dir(:elixir))'))/*/ebin -eval " \
+ {ok, Apps} = application:ensure_all_started('$(APP)'), \
+ true = lists:member(libsalty2, Apps), \
+ halt()"
+
+core-elixir-rel: init
+
+ $i "Bootstrap a new release named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib bootstrap-rel $v
+
+ $i "Add Lager, Jason, Phoenix to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lager jason phoenix\ndep_lager = git https://github.com/erlang-lager/lager master\ndep_jason = git https://github.com/michalmuskala/jason.git master\ndep_phoenix = hex 1.7.2\nELIXIR = system\n"}' $(APP)/Makefile
+
+ $i "Add the lager_transform parse_transform to ERLC_OPTS"
+ $t echo "ERLC_OPTS += +'{parse_transform, lager_transform}'" >> $(APP)/Makefile
+
+ifdef LEGACY
+ $i "Add Lager, Jason and Phoenix to the applications key in the .app.src file"
+ $t perl -ni.bak -e 'print;if ($$.==7) {print "\t\tlager,\n\t\tjason,\n\t\tphoenix,\n"}' $(APP)/src/$(APP).app.src
+endif
+
+ $i "Build the release"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that the release was built"
+ $t test -d $(APP)/_rel
+ $t test -d $(APP)/_rel/$(APP)_release
+ $t test -d $(APP)/_rel/$(APP)_release/bin
+ $t test -d $(APP)/_rel/$(APP)_release/lib
+ $t test -d $(APP)/_rel/$(APP)_release/releases
+ $t test -d $(APP)/_rel/$(APP)_release/releases/1
diff --git a/test/core_makedep.mk b/test/core_makedep.mk
index 5a0b02c..6efb2df 100644
--- a/test/core_makedep.mk
+++ b/test/core_makedep.mk
@@ -1,10 +1,10 @@
# Core: COMPILE_FIRST dependencies generation.
-CORE_MAKEDEP_TARGETS = $(call list_targets,core-makedep)
+core_makedep_TARGETS = $(call list_targets,core-makedep)
-.PHONY: core-makedep $(CORE_MAKEDEP_TARGETS)
+.PHONY: core-makedep $(core_makedep_TARGETS)
-core-makedep: $(CORE_MAKEDEP_TARGETS)
+core-makedep: $(core_makedep_TARGETS)
core-makedep-behavior: init
@@ -25,6 +25,46 @@ core-makedep-behavior: init
$t test -f $(APP)/ebin/boy.beam
$t test -f $(APP)/ebin/human.beam
+core-makedep-ignore-filenames-with-spaces: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+ $t mkdir $(APP)/src/core
+
+ $i "Generate related .erl files"
+ $t printf "%s\n" "-module(human)." "-export([live/0])." "live() -> ok." > $(APP)/src/core/human.erl
+ $t printf "%s\n" "-module(boy)." "-import(human,[live/0])." > $(APP)/src/boy.erl
+ $t printf "%s\n" "-module(boy)." "-import(human,[live/0])." > $(APP)/src/my\ boy.erl
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that all compiled files exist"
+ $t test -f $(APP)/$(APP).d
+ $t test -f $(APP)/ebin/$(APP).app
+ $t test -f $(APP)/ebin/boy.beam
+ $t test -f $(APP)/ebin/human.beam
+
+core-makedep-ignore-special-files: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+ $t mkdir $(APP)/src/core
+
+ $i "Generate related .erl files"
+ $t printf "%s\n" "-module(human)." "-export([live/0])." "live() -> ok." > $(APP)/src/core/human.erl
+ $t printf "%s\n" "-module(boy)." "-import(human,[live/0])." > $(APP)/src/boy.erl
+ $t printf "%s\n" "-module(boy)." "-import(human,[live/0])." > $(APP)/src/.#boy.erl
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that all compiled files exist"
+ $t test -f $(APP)/$(APP).d
+ $t test -f $(APP)/ebin/$(APP).app
+ $t test -f $(APP)/ebin/boy.beam
+ $t test -f $(APP)/ebin/human.beam
+
core-makedep-import: init
$i "Bootstrap a new OTP library named $(APP)"
diff --git a/test/core_misc.mk b/test/core_misc.mk
index 9b7aa92..3cd8562 100644
--- a/test/core_misc.mk
+++ b/test/core_misc.mk
@@ -2,11 +2,11 @@
#
# The miscellaneous tests use the prefix "core-", not "core-misc-".
-CORE_MISC_TARGETS = $(filter-out core-misc,$(call list_targets,core))
+core_misc_TARGETS = $(filter-out core-misc,$(call list_targets,core))
-.PHONY: core-misc $(CORE_MISC_TARGETS)
+.PHONY: core-misc $(core_misc_TARGETS)
-core-misc: $(CORE_MISC_TARGETS)
+core-misc: $(core_misc_TARGETS)
core-clean-crash-dump: init
diff --git a/test/core_plugins.mk b/test/core_plugins.mk
index f8fbff3..8544945 100644
--- a/test/core_plugins.mk
+++ b/test/core_plugins.mk
@@ -1,10 +1,10 @@
# Core: External plugins.
-CORE_PLUGINS_TARGETS = $(call list_targets,core-plugins)
+core_plugins_TARGETS = $(call list_targets,core-plugins)
-.PHONY: core-plugins $(CORE_PLUGINS_TARGETS)
+.PHONY: core-plugins $(core_plugins_TARGETS)
-core-plugins: $(CORE_PLUGINS_TARGETS)
+core-plugins: $(core_plugins_TARGETS)
core-plugins-all: init
@@ -194,7 +194,7 @@ core-plugins-templates: init
$t mkdir -p $(APP)/plugin_dep
$t printf "%s\n" \
"define tpl_test_mk" \
- "-module(test_mk)." \
+ "-module(template_name)." \
"endef" > $(APP)/plugin_dep/plugins.mk
$t cd $(APP)/plugin_dep && \
git init -q && \
@@ -263,6 +263,43 @@ core-plugins-templates-apps-only: init
$i "Check that the file was compiled correctly"
$t test -f $(APP)/apps/my_app/ebin/test_mk.beam
+core-plugins-templates-file: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Create a local git repository with a plugin containing a template file"
+ $t mkdir -p $(APP)/plugin_dep/templates
+ $t printf "%s\n" "-module(template_name)." > $(APP)/plugin_dep/templates/test_mk.erl
+ $t echo "THIS := \$$(dir \$$(realpath \$$(lastword \$$(MAKEFILE_LIST))))" > $(APP)/plugin_dep/plugins.mk
+ $t printf "%s\n" "tpl_test_mk = \$$(file < \$$(THIS)/templates/test_mk.erl)" >> $(APP)/plugin_dep/plugins.mk
+ $t cd $(APP)/plugin_dep && \
+ git init -q && \
+ git config user.email "[email protected]" && \
+ git config user.name "test suite" && \
+ git add . && \
+ git commit -q --no-gpg-sign -m "Tests"
+
+ $i "Add dependency and plugins to the Makefile"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = plugin_dep\ndep_plugin_dep = git file://$(abspath $(APP)/plugin_dep) master\nDEP_PLUGINS = plugin_dep\n"}' $(APP)/Makefile
+
+ $i "Run 'make list-templates' and check that it prints test_mk"
+ $t $(MAKE) --no-print-directory -C $(APP) list-templates | grep -qw test_mk
+
+ $i "Create a new file using the template"
+ $t $(MAKE) --no-print-directory -C $(APP) new t=test_mk n=test_mk $v
+
+ $i "Confirm the file exists"
+ $t test -f $(APP)/src/test_mk.erl
+
+ $i "Build the application"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that the file was compiled correctly"
+ $t test -f $(APP)/ebin/test_mk.beam
+
core-plugins-test: init
$i "Bootstrap a new OTP library named $(APP)"
diff --git a/test/core_query.mk b/test/core_query.mk
index 380f4ad..394652a 100644
--- a/test/core_query.mk
+++ b/test/core_query.mk
@@ -1,10 +1,10 @@
# Core: Querying dependencies.
-CORE_QUERY_TARGETS = $(call list_targets,core-query)
+core_query_TARGETS = $(call list_targets,core-query)
-.PHONY: core-query $(CORE_QUERY_TARGETS)
+.PHONY: core-query $(core_query_TARGETS)
-core-query: $(CORE_QUERY_TARGETS)
+core-query: $(core_query_TARGETS)
core-query-deps: init
@@ -154,7 +154,7 @@ endif
"farwest: cowlib git https://github.com/ninenines/cowlib master" \
"farwest: cowboy git https://github.com/ninenines/cowboy master" \
"farwest: gun git https://github.com/ninenines/gun master" \
- "gun: cowlib git https://github.com/ninenines/cowlib 2.10.1" \
+ "gun: cowlib git https://github.com/ninenines/cowlib master" \
> $(APP)/expected-deps.txt
$t cmp $(APP)/expected-deps.txt $(APP)/.erlang.mk/query-deps.log
diff --git a/test/core_upgrade.mk b/test/core_upgrade.mk
index 84ff54a..c9fea3d 100644
--- a/test/core_upgrade.mk
+++ b/test/core_upgrade.mk
@@ -1,10 +1,10 @@
# Core: Erlang.mk upgrade.
-CORE_UPGRADE_TARGETS = $(call list_targets,core-upgrade)
+core_upgrade_TARGETS = $(call list_targets,core-upgrade)
-.PHONY: core-upgrade $(CORE_UPGRADE_TARGETS)
+.PHONY: core-upgrade $(core_upgrade_TARGETS)
-core-upgrade: $(CORE_UPGRADE_TARGETS)
+core-upgrade: $(core_upgrade_TARGETS)
core-upgrade-changelog: init
@@ -16,8 +16,6 @@ core-upgrade-changelog: init
$i "Fork erlang.mk locally and set a test CHANGELOG.asciidoc"
$t git clone -q https://github.com/ninenines/erlang.mk $(APP)/alt-erlangmk-repo
$t echo "$(APP)$(APP)" > $(APP)/alt-erlangmk-repo/CHANGELOG.asciidoc
-# Since part of this functionality needs the main Makefile, copy it.
- $t cp ../Makefile $(APP)/alt-erlangmk-repo/
$t (cd $(APP)/alt-erlangmk-repo && \
git config user.email "[email protected]" && \
git config user.name "test suite" && \
diff --git a/test/hexpm_packages.txt b/test/hexpm_packages.txt
new file mode 100644
index 0000000..0a55766
--- /dev/null
+++ b/test/hexpm_packages.txt
@@ -0,0 +1,2052 @@
+# Packages page 1
+abnfc 0.5.4
+accept 0.3.5
+acceptor_pool 1.0.0
+achlys 0.3.3
+acorn128 0.0.1
+# Packages page 2
+active 7.11.0
+aebytecode 2.1.0
+ae_enacl 0.17.4
+ae_enoise 1.0.1
+ae_erl_base58 0.0.3
+aequitas 1.3.0
+aeserialization 0.1.1
+agent 0.1.0
+# Packages page 3
+aiml_model_wrapper 0.1.0
+alcove 0.40.6
+aleppo 0.9.0
+# Packages page 4
+alsa 0.2.3
+altworx_utils 0.0.5
+amf 0.1.4
+amoc 3.3.0
+amqp10_client 4.0.3
+amqp10_common 4.0.3
+amqp_client 4.0.3
+amqp_director 1.6.0
+amqp_filter 0.3.11
+anchor 0.3.1
+ansi 0.1.0
+antidotec_pb 0.2.9
+antidote_crdt 0.1.3
+# Packages page 5
+antidote_pb_codec 0.1.2
+any 0.3.2
+apcl 0.1.0
+apdu 0.2.0
+apns4erl 2.6.0
+aqlc 1.0.2
+# Packages page 6
+argo_graphql 1.0.10
+argon2 1.2.0
+argparse 2.0.0
+ascii_table 1.1.6
+# Packages page 7
+assert 0.1.0
+astranaut 0.10.1
+ast_walk 0.3.1
+aten 0.6.0
+atom_utils 1.0.13
+atomvm_packbeam 0.7.2
+atomvm_rebar3_plugin 0.7.3
+# Packages page 8
+augle 0.3.0
+avlizer 0.4.0
+avm_scene 0.1.0
+aws_cli 0.1.0
+aws_credentials 0.3.2
+aws_erlang 1.0.6
+aws_http 0.2.4
+aws_rds_castore 1.2.2
+aws_signature 0.3.2
+# Packages page 9
+b64fast 0.2.3
+b64_nif 0.1.4
+backoff 1.1.6
+backwater 3.6.0
+baleen 1.0.3
+banana_websocket_client 0.0.2
+bank 0.2.2
+# Packages page 10
+bare 0.1.1
+barista 0.3.4
+barrel_encoding 0.1.0
+barrel_ibrowse 4.3.1
+barrel_jiffy 0.14.5
+barrel_oauth 1.6.0
+barrel_unofficial 2.15.0
+base16 2.0.1
+base32 0.1.0
+base32_clockwork 2023.1.0
+base45 2.0.0
+base64url 1.0.1
+basexerl 0.1.2
+basho_exometer_core 1.0.5
+basho_folsom 0.7.5
+basho_hamcrest 0.4.1
+basho_poolboy 0.8.4
+basho_stats 1.0.3
+batiscaph_probe 0.1.1
+bbmustache 1.12.2
+# Packages page 11
+bcrypt 1.2.2
+beamcache 0.7.9
+beamoji 0.1.0
+beam_olympics 1.2.3
+beanstalkd_consumer 3.0.7
+bear 1.1.0
+behavior3 2.0.1
+behavior3erl 1.0.0
+bellboy 2.0.0
+bencoding 1.0.0
+bert 0.2.1
+betterstack_logger 1.0.2
+# Packages page 12
+binbo 4.0.3
+binpp 1.1.1
+bitcask 2.0.2
+bit_utils 1.0.7
+# Packages page 13
+blas 1.0.0
+blockade 0.2.1
+blockfrost_erlang 0.1.1
+bloodbath 1.0.0
+blume 0.1.1
+# Packages page 14
+bookish_spork 0.5.2
+bootstrap 1.1.0
+boto 0.0.1
+bottomer 0.1.1
+boxer 0.1.0
+bpe 9.9.6
+branca_erl 0.3.0
+# Packages page 15
+bristow 0.2.2
+brod 4.3.2
+brod_gssapi 0.1.3
+brod_oauth 0.1.0
+broen 3.0.3
+brotli 0.3.2
+browser_lang 0.1.0
+brucke 1.17.3
+brunhilde 2.0.1
+bson_erlang 0.3.1
+bstr 0.3.0
+bucs 1.1.0
+buffalo 2.1.0
+bugsnag_erl 1.1.6
+bugsnag_erlang 1.1.0
+# Packages page 16
+buoy 0.1.2
+busytone 1.0.0
+cache 2.3.3
+cache_pegb 1.0.1
+cache_service 0.1.0
+cache_tab 1.0.31
+# Packages page 17
+canal 0.4.2
+canister 0.1.1
+captcherl 0.1.1
+cargo 0.1.3
+# Packages page 18
+cerck 0.1.5
+cerlc 0.2.1
+certifi 2.13.0
+cet 0.3.4
+cets 0.2.0
+cf 0.3.1
+cf_client 0.1.6
+cfg 17.12.26
+cf_worker 0.1.6
+cgolam 1.0.1
+cgroups 2.0.7
+# Packages page 19
+channel 0.1.0
+chash 0.1.2
+chatapp 0.1.0
+chatterbox 0.8.0
+choke 1.0.0
+# Packages page 20
+chumak 1.4.0
+claws_fcm 0.1.0
+claws_kafka 0.4.1
+claws_rabbitmq 0.1.0
+claws_rest 0.1.0
+# Packages page 21
+clique 3.0.1
+clje_core_specs_alpha 0.2.56
+clje_spec_alpha 0.2.194
+clje_test_check 1.1.1
+clojerl 0.9.0
+cloudi_core 2.0.7
+cloudi_service_api_batch 2.0.7
+cloudi_service_api_requests 2.0.7
+cloudi_service_cron 2.0.7
+cloudi_service_db_http_elli 1.6.0
+cloudi_service_db_pgsql 2.0.7
+cloudi_service_filesystem 2.0.7
+cloudi_service_funnel 2.0.7
+cloudi_service_health_check 2.0.7
+cloudi_service_http_client 2.0.7
+cloudi_service_http_cowboy 2.0.7
+cloudi_service_http_cowboy1 2.0.7
+cloudi_service_http_elli 2.0.7
+cloudi_service_http_rest 2.0.7
+cloudi_service_map_reduce 2.0.7
+cloudi_service_monitoring 2.0.7
+cloudi_service_null 2.0.7
+cloudi_service_oauth1 2.0.7
+cloudi_service_queue 2.0.7
+cloudi_service_quorum 2.0.7
+cloudi_service_request_rate 2.0.7
+cloudi_service_router 2.0.7
+cloudi_service_send 2.0.7
+cloudi_service_shell 2.0.7
+cloudi_service_tcp 2.0.7
+cloudi_service_udp 2.0.7
+cloudi_service_validate 2.0.7
+cloudi_service_validate_config 2.0.7
+cm17a 0.3.2
+cmd 1.0.0
+# Packages page 22
+code_utils 1.1.9
+coers 0.5.0
+coldstrap 0.1.0
+# Packages page 23
+complex_math 0.2.0-rc1
+concha 0.1.0
+concuerror 0.21.0
+conduit_amqp_client 3.6.2
+conduit_rabbit_common 2.7.1
+conf 0.2.6
+# Packages page 24
+context 0.1.0
+# Packages page 25
+couchbeam 1.5.3
+couchbeam_amuino 1.4.3-amuino.8
+couchdb 2.1.0-beta
+counters 0.2.1
+countries_erlang 0.5.0
+coveralls 2.2.0
+covertool 2.0.7
+cowbell 1.0.1
+cowboy 2.12.0
+cowboy_graphql 0.2.1
+cowboy_oauth 0.2.14
+cowboy_otel 0.2.0
+cowboy_session 1.0.0
+cowboy_swagger 2.7.0
+cowboy_telemetry 0.4.0
+cowlib 2.13.0
+cowmachine 1.13.0
+cozo 0.1.0
+cozodb 0.1.0
+cpg 2.0.7
+cpool 0.1.1
+cps 0.4.0
+cqerl 2.1.3
+# Packages page 26
+crc 0.10.5
+crc32cer 0.1.11
+cre 0.1.8
+credentials_obfuscation 3.4.0
+crossover_io 0.1.0
+crypt 1.0.3
+cryptoapis 1.7.0
+crypto_ext 0.1.4
+crypto_rsassa_pss 2.0.0
+csh2fjhyll_rdb 1.5.6
+# Packages page 27
+csve 3.0.3
+csv_reader 1.0.0
+ct_containers 0.1.1
+ctdh 1.0.1
+ct_groups_summary_hook 0.1.1
+cth_readable 1.6.0
+cttest 6.0.18
+ctx 0.6.0
+cuckoo_cache 0.1.2
+cuckoo_filter 1.0.1
+cuneiform 3.0.4
+curry_erlang 0.1.0
+customized_hdr_histogram 0.3.2
+cut 1.0.3
+cuttlefish 3.4.0
+# Packages page 28
+damm 0.1.0
+darcy 0.0.8
+dasherl 0.2.15
+datalog 2.0.2
+datum 4.6.1
+# Packages page 29
+dbi 1.1.5
+dbi_mysql 0.1.1
+dbi_pgo 0.1.1
+dbi_pgsql 0.2.1
+dbi_sqlite 0.1.0
+dbschema 0.2.2
+dbus_revived 0.8.0
+ddb_client 0.5.9
+ddb_connection 0.4.4
+debbie 1.0.5
+decorator_pt 1.0.3-alertlogic
+decorators 0.1.0
+deeperl 0.10.0
+deigma 1.2.0
+# Packages page 30
+denrei 0.2.5
+depcache 1.10.0
+derby 0.2.0
+dflow 0.3.0
+dhcp 1.0.0
+dhcp_lib 1.0.0
+dh_date 1.0.0
+# Packages page 31
+diffy 1.1.2
+digraph_export 1.0.1
+digraph_viewer 0.1.0
+diint_utilites_common_app 1.4.23
+dinerl 1.3.9
+director 18.9.30
+dirent 1.0.5
+dirs 0.2.0
+discourse_as_sso_erlang 0.7.0
+dispatch_compiler 1.1.0
+# Packages page 32
+dj 0.3.0
+dll_loader_helper_beam 1.2.2
+dns_erlang 1.1.0
+dnssec 0.1.2
+do 2.0.2
+docker_compose_cth 0.3.0
+dockerexec 2.0.3
+docsh 0.7.2
+doctest 0.9.3
+doctest_pg 1.2.3
+dogstatsc 0.1.0
+dogstatsde 1.0.0
+doppler 0.1.0
+dorer 0.1.0
+doteki 1.1.0
+dotenv_config 2.3.3
+# Packages page 33
+dp_decoder 0.2.17
+dproto 0.5.6
+dqe 0.4.15
+dqe_fun 0.2.1
+dqe_idx 0.4.4
+dqe_idx_ddb 0.5.2
+dqe_idx_pg 0.5.7
+dragon_pubsub 0.0.0
+dragon_routes 0.0.0
+dtl 0.12.1
+dtrans 1.2.0
+dtu 0.1.3
+duoweb 1.0.0
+# Packages page 34
+e2h 0.4.2
+e2qc 1.2.1
+eaglesong 1.0.0
+eauthor 17.12.30
+eavmlib 0.1.0
+eavro 0.0.5
+ebase32 1.0.1-2.86707d9
+ebase58 1.0.0-3.0c1b609
+ebeanstalkd 3.0.0
+ebils 0.1.1
+ebitmap 0.2.3
+eblake2 1.0.0
+eblurhash 1.2.2
+ebox 1.0.1
+ebpf 0.2.3
+ebs 2.1.0
+ecache 2.14.2
+ecaptcha 0.2.0
+ecat 1.0.0
+ecbor 0.7.1
+ecc_compact 1.1.1
+echc 0.1.0
+ecies 1.1.0
+ecimd2 0.0.8
+ecms 1.0.0
+ecoap 0.1.0
+ecomm 1.0.2
+econfig 0.7.3
+ecpool 0.4.2
+ecql 5.1.3
+ecron 1.0.0
+# Packages page 35
+ecrontab 0.6.1
+ecsv 1.4.2
+# Packages page 36
+# Packages page 37
+ecureuil 1.0.2
+edate 1.0.0
+edbg 0.9.6
+edgar 1.0.2
+edifa 1.0.0
+ediff 1.0.0
+edis_proto 0.2.0
+edocmermaid 0.1.0
+edown 0.9.1
+educkdb 0.7.0
+eenv 0.1.1
+eesql 0.4.19
+eetcd 0.4.0
+efene 0.99.2
+effi 0.1.6
+efgrep 1.0.0
+efirebirdsql 0.9.10
+eflambe 0.3.1
+efluentc 0.2.0
+efranc 0.0.1
+efrisby 0.2.0
+efuse 1.0.2
+efuse_filter 0.1.0
+egcache 0.1.0
+egeonames 0.1.1
+egetopt 1.2.0
+egit 0.1.9
+egithub 0.7.0
+egoc 0.1.1
+egoth 0.1.0
+# Packages page 38
+egssapi 0.1.0
+eharbor 1.0.0
+ehash 0.2.1
+ehashids 0.1.4
+eiconv 1.0.0
+eimp 1.0.23
+eini 1.2.9
+eini_beam 2.2.4
+eipmi 4.1.0
+ejabberd 24.10.0
+ejpet 0.8.0
+ejsonpath 0.2.1
+ejwt 0.1.0
+ekka 0.7.4
+elab 0.1.0
+elb 1.0.1
+eld 1.0.0-beta1
+elector 0.3.0
+eleveldb 2.2.20
+elib 0.0.1
+elibphonenumber 8.13.50
+# Packages page 39
+# Packages page 40
+elli 3.3.0
+elli_basicauth 0.1.0
+elli_cache 1.0.1
+elli_cloudfront 0.3.3
+elli_cookie 0.3.0
+elli_date 1.1.1
+elli_json 0.1.0
+elli_log_exceptions 0.1.0
+elli_otter 0.2.0
+elli_prometheus 0.2.0
+elli_swagger 0.4.1
+elli_websocket 0.1.1
+elli_ws_undertone 0.1.2
+elli_xpblfe 0.2.3
+elmdb 0.4.1
+elocaltime 1.4.1
+elogsene_logger 1.0.2
+elogstash 1.0.0
+elogx 0.0.2
+elru 1.1.0
+elvis 3.2.6
+elvis_core 3.2.5
+em 7.3.0
+email_validator 1.1.0
+emarkdown 0.1.0
+emeter 18.6.13
+emmap 2.1.1
+emo 0.3.1
+# Packages page 41
+emodel 1.6.0
+emojipoo 0.1.0
+emon 0.2.1
+emqtt 1.11.0
+emqx_ct_helpers 1.1.4
+emsgpack 0.8.0
+emv 0.7.0
+emysql 0.4.1
+emysql_orm 0.0.1
+enacl 1.2.1
+enanoid 0.1.0
+encoding_utils 1.0.7
+eneo4j 1.0.0
+enet 1.0.0
+enoise 1.1.0
+enough 0.1.0
+ensq 0.1.7
+entropy_string_erl 1.1.1
+eodbc 0.2.0
+ep 0.2.0
+epam 1.0.14
+epcap 1.1.3
+epcap_compile 1.0.6
+eper 0.99.1
+epgpool 1.1.1
+epgsql 4.7.1
+epgsql_decimal 1.0.0
+ephemeral 2.0.4
+ephp 0.3.1
+epipe 1.0.0
+# Packages page 42
+epl 0.2.0
+epmdless 0.3.0
+epmdlib 1.0.0
+epns 1.1.0
+epocxy 1.1.0
+epqueue 1.2.6
+epsql 0.1.0
+epubnub 0.1.0
+eql 0.2.0
+equery 0.17.2
+eradius 2.3.1
+erbloom 2.1.0-rc.2
+erc 0.1.1
+eredis 1.7.1
+eredis_cluster 0.9.0
+eredis_pool 2.1.0
+eredis_streams 0.1.0
+eredis_sync 0.1.4
+ereturn 18.6.14
+ergb 0.2.8
+erg_unicode 0.1.0
+erlando 3.1.1
+erlang_base62 1.0.1
+erlang_behaviour_trees 0.5.22
+erlang_color 1.0.0
+erlang_commons 0.1.0
+erlang_dbus 0.2.0
+erlang_decimal 0.6.3
+erlang_decorators 0.3.1
+erlang_doctor 0.2.7
+erlang_ds 0.4.1
+erlang_exif 3.0.0
+erlang_json_logger 0.2.0
+erlang_localtime 1.0.0
+erlang_osc 1.0.1
+erlang_pbkdf2 2.0.5
+erlang_pmp 0.1.1
+erlang_psq 1.0.0
+erlang_rethinkdb 0.2.2
+erlang_skiplist 0.3.0
+erlang_svg 0.2.0
+erlang_tc 0.1.0
+erlang_term 2.0.7
+erlang_tls 1.0.3
+erlang_version 0.2.0
+erlang_xxhash 0.2.0
+erlangzmq 1.1.2
+erlastic_search 1.5.0
+erlavro 2.9.10
+erl_base58 0.0.1
+erl_bencode 1.0.2
+erlbus 0.3.0
+erl_cache 1.7.6
+erlcaptcha 2.0.0
+erlcard 1.1.1
+erlcass 4.1.3
+erl_cbor 2.0.1
+erlchronos 2.0.1
+erl_cidr 1.2.1
+erlcloud 3.8.1
+erlcode 0.1.0
+erlcron 1.2.3
+erl_csv 0.3.2
+erldb 1.0.0
+erldist_filter 1.1.0
+erldn 1.0.6
+erldns 1.0.0
+erldocs 0.9.6
+erldocs_other 0.9.6
+erldrasil 0.1.0
+erldyn 0.7.2
+erlesy 1.0.3
+erl_eval_records 1.0.0
+erlexec 2.0.7
+erl_exercism 0.2.0
+erlfdb 0.2.1
+erlffx 1.2.0
+erlflake 0.1.1
+# Packages page 43
+erlflow 0.1.0
+erlfmt 1.5.0
+erlguten 1.0.0
+erl_hash 1.0.5
+erliam 1.0.1
+erlias 0.2.0
+erljson 0.2.1
+erljwt 2.1.0
+erlkaf 2.1.6
+erllambda 2.2.3
+erlmemfs 0.1.0
+erlmld 1.2.0
+erl_nbt 1.0.0
+erlogger 0.1.0
+erlogstash 0.10.7
+erlpass 1.0.7
+erlPass 0.3.0
+erl_pengine 0.1.1
+erlperf 2.3.0
+erl_pipeline 0.2.0
+erlpocket 2.1.0
+erlpool 1.4.4
+erlpop 2.3.1
+erlport 0.11.0
+erlquad 1.1.2
+erlquery 0.4.0
+erlsass 1.1.1
+erlsci_getopt 1.1.0
+erlscrypt 1.2.2
+erl_snowflake 1.1.0
+erlsom 1.5.1
+erl_tcp 0.1.1
+erlte 0.1.0
+erltls 1.4.2
+erl_tools 0.0.1
+erltrace 0.1.6
+erluap 1.2.3
+erluca 0.1.1
+erlup 0.3.0
+erlware_commons 1.7.0
+erlwater 0.1.6
+erl_web_push 0.1.0
+erlxml 1.0.3-beta
+erl_xxhash 0.2.0
+erlydtl 0.14.0
+erlydtl2 0.11.1
+erlyfix 0.1.0
+erlz 0.1.0
+erlzk 0.6.4
+erlzk_pd 0.6.4
+erlzmq 3.0.1
+erlzmq_dnif 4.1.4
+erlzord 1.1.0
+erocksdb 0.4.1
+erpcgen 1.1.1
+erqwest 0.2.5
+ersip 1.1.0
+erupt 0.1.0
+erupt_mysql 0.1.0
+erupt_postgres 0.1.0
+erupt_sqlite3 0.1.0
+erwatch 0.3.0
+esaml 4.6.0
+esel 0.1.2
+esimdjson 0.1.0
+esip 1.0.56
+esmpp 0.0.13
+esnowflake 0.4.3
+esockd 5.8.2
+espace 0.8.0
+# Packages page 44
+esq 2.0.6
+esqlcipher 2.0.0-rc.3
+esqlite 0.8.8
+esss 1.0.3
+estdinout 1.0.0
+estore 0.1.10
+esvm 1.0.0
+esysevent 1.0.0
+etacacs_plus 0.1.3
+etcdc 0.3.1
+etcp 17.9.10
+etest 1.2.1
+etest_http 1.0.2
+etls 1.2.0
+etoml 0.1.0
+etotp 1.0.1-6.c979c63
+etr 1.0.0
+etran 0.5.2
+etrie 1.1.0
+ets_cas 0.1.1
+etskv 0.2.0
+etsmgr 0.2.0
+euneus 2.4.0
+eunicode2gsm 1.1.0
+euniq 1.0.0
+eunit_addons 1.2.0
+eunit_formatters 0.5.0
+eunit_helper 0.0.4
+eunit_sugar 0.1.0
+eunzip 1.0.0
+euri 0.11.0
+# Packages page 45
+evaluator 0.1.3
+evel 0.1.2
+event_store_db_gpb_protobufs 2.4.0
+evews 0.1.9
+evision 0.2.9
+ewc 1.0.0
+ewpcap 1.1.5
+# Packages page 46
+exat 0.1.0
+# Packages page 47
+# Packages page 48
+# Packages page 49
+exe 7.11.0
+exec 1.0.1
+exemplar 0.6.0
+exerl 0.2.2
+exerl_build 0.0.2
+exerl_dep 0.0.2
+# Packages page 50
+# Packages page 51
+# Packages page 52
+# Packages page 53
+exodus 0.1.0
+exodus_mysql 0.1.0
+exodus_postgres 0.1.0
+exodus_sqlite3 0.1.0
+exometer_core 2.0.0
+exometer_fetch 0.1.0
+exometer_influxdb 0.6.0
+exometer_report_graphite 1.0.1
+exometer_report_lager 1.0.0
+exor_filter 0.8.2
+# Packages page 54
+# Packages page 55
+# Packages page 56
+# Packages page 57
+# Packages page 58
+# Packages page 59
+ezic 0.2.3
+ezlib 1.0.13
+ezstd 1.1.0
+fake_lager 1.0.0
+fake_turn 0.4.3
+fast_base16 1.1.1
+# Packages page 60
+fast_pbkdf2 1.0.6
+fast_scram 0.6.0
+fast_tls 1.1.22
+fast_xml 1.1.53
+fast_yaml 1.0.37
+fcm 0.1.0
+fernet 0.1.0
+fieldmask 0.0.1
+fifocache 1.0.1
+fifo_db 0.2.8
+# Packages page 61
+fifo_dt 0.2.26
+fifo_lager 0.1.8
+fifo_s3 0.2.15
+fifo_spec 0.1.34
+fifo_utils 0.1.53
+file_signatures 0.1.9
+filezcache 2.2.0
+fire 0.1.4
+firebase_admin 0.1.3
+firebase_token 1.1.1
+fixer 0.2.4
+# Packages page 62
+flatlog 0.1.2
+fling 1.0.1
+# Packages page 63
+fn 1.0.0
+foil 0.1.3
+folsom 1.0.0
+folsom_ddb 0.3.1
+folsomite 1.3.0
+foodog 0.2.1
+form 8.3.0
+forms 0.0.1
+forseti 2.2.0
+# Packages page 64
+freshman_test 0.2.1
+fs 8.6.1
+fs_erlsci 8.7.1
+fs_event 1.0.0
+fs_sync 1.1.3
+fswitch 1.4.1
+ftpfilez 1.3.0
+fusco 0.1.1
+fuse 2.5.0
+# Packages page 65
+gdminus 1.2.0
+geas 2.8.1
+geas_rebar3 1.4.16
+geminic 0.1.0
+gen_batch_server 0.8.9
+gen_cycle 1.0.4
+gen_errand 0.0.1
+gen_flow 0.0.5
+# Packages page 66
+gen_fsm_compat 0.3.0
+gen_fw 18.6.2
+gen_icmp 0.6.2
+gen_ircclient 0.1.1
+gen_leader 0.1.0
+gen_nbs 0.7.7
+gen_pnet 0.1.7
+gen_rest_client 17.12.24
+gen_rpc 2.1.0
+gen_smtp 1.2.0
+gen_smtp_temp_fix_ssl 0.14.0
+gen_xml 0.1.0
+geocoding 0.3.1
+geo_gateway 0.2.0
+# Packages page 67
+geolite2data 1.0.0
+getopt 1.0.3
+gettexter 0.1.0
+ghatest 0.10.0
+gisla 2.1.1
+# Packages page 68
+giza 0.0.1
+gj 0.1.0
+gleam_beam 0.1.0
+gleam_codec 0.2.0
+gleam_decode 1.7.0
+gleam_experimental_stdlib 0.8.0
+gleam_file 0.1.0
+gleam_jsone 0.5.0
+gleam_sentry 0.1.1
+gleam_should_assertions 0.1.0
+gleam_string_builder 0.1.0
+gleam_uuid 0.1.1
+gleam_validator 0.2.0
+# Packages page 69
+glob 1.0.0
+global_flags 1.0.0
+# Packages page 70
+gmo_pg 0.0.1
+goldrush 0.1.9
+# Packages page 71
+# Packages page 72
+# Packages page 73
+# Packages page 74
+google_token 1.0.5
+gourd 0.1.0
+gpb 4.21.1
+gpio 0.6.3
+gproc 1.0.0
+gradualizer 0.2.0
+granderl 0.1.5
+graphiter 1.0.6
+graphql_erl 0.16.1
+graphql_erlang 0.2.10
+graylog_lager 1.4.5
+grid 0.2.1
+# Packages page 75
+grisp 2.7.0
+grisp_connect 1.1.0
+grisp_cryptoauth 2.4.0
+grisp_emulation 0.2.2
+grisp_tools 2.7.1
+grisp_update_packager 1.0.0
+grisp_updater 2.1.0
+grisp_updater_grisp2 0.2.0
+grpcbox 0.17.1
+grpcbox_plugin 0.9.0
+grpc_cowlib 2.8.1
+grpc_gun 2.0.1
+grpc_lib 0.1.2
+grpc_update 2.0.0
+gruff 0.1.0
+gsm_coder 1.0.2
+gtp 0.2.1
+gtplib 3.4.0
+gun 2.1.0
+# Packages page 76
+gun_update 2.1.0
+gurka 0.1.8
+gustav 0.1.8
+h1 2.3.0
+h3 3.7.2-b
+hacker_news 0.0.3
+hackney 1.20.1
+hackney_telemetry 0.2.0
+hairnet 1.0.0
+haki 0.3.2
+hamcrest 0.1.3
+haproxy_protocol 0.1.2
+harness_erlang_murmurhash 1.0.0
+harness_ff_erlang_client_api 1.0.3
+harness_ff_erlang_server_sdk 3.0.2
+hasaki_emysql 0.5.1
+hashids_erlang 1.0.5
+hash_ring 0.4.2
+# Packages page 77
+havoc 0.2.3
+hdr_histogram 0.5.0
+hearty 0.0.0
+heja 0.1.4
+helium 0.1.0
+hello_erl 0.1.2
+# Packages page 78
+heroku_crashdumps 0.1.0
+hex2bin 1.0.0
+hex_core 0.10.3
+hexml 3.4.1
+hextree 0.1.6
+hkdf_erlang 1.0.0
+hlc 3.0.1
+hoax 0.11.2
+holiday_jp_clje 0.1.1
+# Packages page 79
+homotopy 1.3.1
+hooks 2.1.0
+horatio 0.2.0-rc1
+horus 0.3.0
+host_triple 0.1.0
+hotp 1.0.2
+hpack_erl 0.3.0
+hterl 0.10.0
+htmerl 0.1.0
+htnerlang 0.1.0
+hts 1.3.1
+httpb 0.4.2
+http_cache 0.3.1
+http_cache_store_behaviour 0.3.0
+http_cache_store_disk 0.3.1
+http_cache_store_memory 0.3.1
+http_cache_store_native 0.2.0
+httpc_aws 0.4.2
+# Packages page 80
+http_message_signatures 1.0.0-alpha.1
+http_signature 2.0.0
+hund 0.1.1
+hut 1.4.0
+hydro 0.5.0
+hyper 1.0.1
+iam 0.0.1
+# Packages page 81
+iban 0.7.0
+ibrowse 4.4.2
+iconv 1.0.14
+iconverl 3.0.21
+idl 1.0.1
+idna 6.1.1
+idris2 0.2.1-alpha.1
+ierl 0.4.0
+imap_utf7 1.0.0
+# Packages page 82
+inaka_aleppo 1.1.1
+inaka_emysql 0.5.0
+inaka_iso8601 1.1.2
+inaka_mixer 1.2.0
+inert 1.0.5
+inet_ext 1.0.0
+influxdb 0.2.1
+influx_udp 1.1.2
+inotify 0.4.3
+# Packages page 83
+intercept 1.0.0
+interval_tree_clocks 1.0.1
+ip2locationdata 0.0.5
+ip2region_erlang 0.1.0
+ipaddr 0.1.0
+ipinfo 1.0.2
+iptables 0.1.6
+irc_parser 0.1.0
+is_auto_imported_bif 17.8.24
+ishikawa 0.0.3
+# Packages page 84
+iso8583_erl 0.4.1
+iso8601 1.3.4
+iso_erlang 0.11.0
+istype 0.2.3
+itc 0.4.0
+iterator 0.0.4
+jaeger_passage 0.1.14
+jam 1.0.0
+# Packages page 85
+jargon 1.0.1
+jason_erl 1.2.2
+jaws3 0.1.1
+jb_private123 0.1.0
+jc 1.2.1
+jch 0.2.3
+jchash 0.1.4
+jesse 1.8.1
+jhn_stdlib 5.3.2
+jiffy 1.1.2
+jobs 0.10.0
+jose 1.11.10
+jpparse 1.3.1
+# Packages page 86
+jsn 2.2.2
+jsone 1.9.0
+jsonlog 0.1.0
+json_polyfill 0.1.4
+jsonpull 0.1.1
+jsx 3.1.0
+jsxd 0.2.4
+jsxrecord 2.2.0
+jun 0.2.6
+jupyter 0.5.0
+justatimer 0.1.2
+# Packages page 87
+jwalk 1.2.0
+jwerl 1.2.0
+jwt 0.1.11
+k6_bytea 1.1.5
+kaa 0.2.26
+kafe 2.2.3
+kafka_protocol 4.1.10
+kafkerl 2.1.0
+kairos 1.0.1
+kanin 0.6.0
+kashe 1.0.1
+katana 1.0.0
+katana_code 2.2.0
+katana_test 1.0.1
+katipo 1.1.1
+katja 0.10.0
+katja_echo 0.1.1
+katja_vmstats 0.8.2
+katt 1.6.10
+kdtree 1.0.0
+keccak 2.0.0
+keccakf1600 3.0.0
+keccakf1600_diode_fork 3.0.0
+keccakf1600_nash_fork 2.1.2
+keccakf1600_orig 2.1.0
+# Packages page 88
+keccakf1600_otp23 2.0.0
+ken 0.1.1
+kerlberos 2.0.1
+key2value 2.0.7
+keys1value 2.0.7
+keyserver 1.0.0
+keysmith 0.5.0
+kflow 1.1.0
+khepri 0.16.0
+khepri_mnesia_migration 0.7.1
+kinetic 1.3.11
+# Packages page 89
+kivra_merlin 3.0.1
+kla 0.9.1
+kraft 0.1.0
+kube_dist 0.0.2
+kuberl 0.2.0
+kuberlnetes 0.1.0
+# Packages page 90
+kvconf 2024.3.1
+kv_index_tictactree 0.9.4
+kylie 1.0.1
+kyu 2.0.5
+lager 3.9.2
+lager2json 1.0.2
+lager_cloudwatch 0.1.2
+lager_exometer_backend 0.1.0
+lager_folsom 1.0.1
+lager_graylog 1.1.0
+lager_hipchat 0.2.1
+lager_html 0.0.1
+lager_humio_backend 1.3.5
+lager_iowrite_formatter 1.0.0
+lager_json_formatter 0.2.4
+lager_logentries 0.1.0
+lager_logstash 0.1.2
+lager_logstash_backend 0.1.3
+lager_logtail 0.2.0
+lake 0.2.1
+lambda 0.1.1
+lambda_throttle 0.3.0
+lanes 0.3.3
+lanes_barista 0.3.3
+lanes_elli 0.3.3
+lasp 0.10.0
+lasp_bench 0.0.1
+lasp_pb 0.0.4
+lasp_pg 0.1.0
+lasp_support 0.1.0
+launchdarkly_server_sdk 3.5.0
+lazy 0.0.1
+lazy_lists 0.1.0
+lb 17.6.12
+# Packages page 91
+lbm_kv 0.0.2
+lc 0.3.2
+lcfg 0.5.0-rc3
+lcli 0.1.1
+ldb 0.0.18
+ledis 0.3.0
+lee 0.1.0
+lejson 0.8.0
+levaindoc 0.7.0
+leveled 1.1.0-hex
+leveled_lz4 1.9.4-leveled-hex.4
+leveled_zstd 1.5.4-leveled-hex.2
+lfe 2.1.5
+lfe_dragon 0.0.0
+lfe_http 0.5.4
+lfe_machine_tv 3.0.1
+lfe_yuri 0.3.2
+lhc 0.4.0
+lhttpc 1.7.1
+libchunter 0.1.52
+# Packages page 92
+lib_combin 0.1.5
+lib_conf 0.1.5
+libdecaf 2.1.1
+libdecaf_amend 0.0.1
+lib_dp 0.1.0
+libhowl 0.1.42
+libleofs 0.1.3
+libp2p_crypto 1.4.1
+libp2p_peerbook 0.2.0
+lib_parallel 0.1.1
+libphonenumber_erlang 0.2.1
+libsecp256k1_nif 0.0.3
+libsnarl 0.3.55
+libsnarlmatch 0.1.8
+libsniffle 0.3.71
+libsodium 2.0.1
+liburi 3.0.1
+libvxe_erl 0.1.0
+# Packages page 93
+ljson 0.6.0-rc1
+lldp 0.1.0
+llists 1.2.0
+# Packages page 94
+lmug 0.2.8
+lmug_inets 0.1.1
+local 0.2.1
+locker 1.0.8
+locks 0.2.0
+locus 2.3.10
+logflare_erl 0.2.0
+logger_colorful 0.1.0
+logger_debug_h 0.2.0
+logger_formatter_json 0.8.4
+logger_journald 0.3.1
+logger_logstash 0.1.3
+logger_webhook_h 1.1.0
+# Packages page 95
+logi 0.5.8
+logi_prometheus 0.1.2
+logi_stdlib 0.1.2
+logjam 1.2.4
+logstasher 1.1.0
+loise 1.3.0
+lpr 0.1.2
+lric 0.3.0
+lru 2.4.0
+lrw 2.0.1
+ltest 0.13.9
+luaport 1.6.3
+luerl 1.2.3
+# Packages page 96
+lutil 0.15.0
+lxml 0.4.3
+lz4 0.2.4
+lz4b 0.0.11
+lz4_erl 0.2.4
+m3u8 0.2.1
+mach 4.7.0
+mad 7.1.1
+maildir_commander 0.6.5
+# Packages page 97
+mapsd 0.2.0
+map_sets 1.1.0
+maps_in 0.2.0
+maputils 0.4.1
+mapz 2.4.0
+markerl 0.1.0
+# Packages page 98
+match_trie 0.1.0
+mbcs 1.1.1
+mcache 0.3.1
+mc_dactyl 1.0.1
+mc_eredis 2.6.2
+mc_gen_rpc 3.0.1
+mc_lhttpc 4.3.2
+mc_mustache 1.0.1
+# Packages page 99
+mc_pbkdf2 2.2.1
+mc_poolgirl 2.2.1
+mc_sbroker 1.1.2
+mc_small_ints 1.1.1
+mc_vsn_transform 1.1.1
+md2 1.2.0
+mdns_client 0.1.10
+mdns_client_lib 0.1.46
+mdns_server 0.2.0
+mdns_server_lib 0.2.3
+meck 0.9.2
+medoc 1.0.0
+mekao 0.4.3
+# Packages page 100
+# Packages page 101
+memdb 0.2.0
+memhash 0.1.0
+memstore 0.2.3
+merkerl 1.1.1
+merklet 2.0.0
+merkletree 0.1.0
+mero 1.4.4
+meta 0.1.3
+metal 0.1.1
+metrics 2.5.0
+metrics_reader 0.1.13
+metronome 0.0.2
+# Packages page 102
+mgmepi 0.9.0
+m_http 0.2.2
+midilib 0.5.2
+miffy 2.0.0
+milenage 0.2.0
+mime_lookup 0.1.1
+mimerl 1.3.0
+mimetypes 1.1.0
+minikube 1.0.0
+minmay 1.2.0
+mixactions 0.2.0
+# Packages page 103
+mls 0.1.4
+mmath 0.2.26
+mnesplit 0.0.1
+mnkv 0.1.0
+mochicow 0.6.4
+mochiweb 3.2.2
+mochiweb_html 2.15.0
+mochiweb_util 0.1.0
+# Packages page 104
+mockgyver 1.8.0
+mongodb_client 3.2.0
+mongodb_erlang 3.4.0
+mongodriver 1.0.0
+mongoose_jid 2.2.0
+# Packages page 105
+mpgit 0.1.1
+mq 0.4.0
+mqtree 1.0.17
+mqtt 0.3.3
+mqtt_client 1.0.5
+mqtt_packet_map 1.1.0
+mqtt_sessions 2.6.0
+msgpack 0.8.1
+msgpack_rpc_erlang 0.6.4
+msmp 0.1.2
+msrpce 0.1.1
+mstore 0.3.7
+mstore_inspector 0.1.1
+mtproto_proxy 0.7.1
+mtxmkt 0.1.0
+multiaddr 1.1.3
+multihash 2.1.0
+# Packages page 106
+m_unicode 0.1.0
+mutagen 0.1.0
+mybench 0.0.0
+my_cargo 0.1.3-rc.1
+my_cowboy 2.12.0
+myesockd 5.9.4
+my_esockd 5.9.4
+mylib 0.1.1
+myproto 0.3.2
+my_rebar3_cargo 0.1.1-rc.1
+myriad 1.0.15
+mysql 1.8.0
+mysql_client 1.2.8
+n2o 11.9.6
+# Packages page 107
+narcs 0.1.0
+nat 0.4.0
+natserl 0.1.3
+nats_msg 0.4.1
+nat_upnp 0.1.0
+nconf 0.0.1
+nd_index 1.7.1
+ndisc_redis 0.0.4
+nebula 0.1.1
+neo4j 0.3.0
+# Packages page 108
+# Packages page 109
+nested 0.1.2
+netcdf_nif 0.1.2
+netflow 1.0.0
+netlink 1.1.0
+newrelic 0.1.0
+nextroll_erlcloud 3.4.1
+nextroll_lhttpc 1.4.0
+nextroll_rebar3_gpb_plugin 3.0.0
+nextroll_zstd 1.1.0
+niffler 0.3.2
+nifi_s2s 0.0.2
+nif_libsecp256k1 0.0.2
+# Packages page 110
+nine 0.2.0
+nine_cowboy 0.1.1
+nine_elli 0.1.0
+nitro 9.9.6
+nitro_cache 0.5.0
+nitrogen_core 3.0.0-alpha.13
+nitro_qrcode 1.1.0
+nkferl 0.1.2
+nlocks 1.1.2
+nm 0.0.1
+noble 0.0.4
+nodefinder 2.0.7
+noise 0.0.5
+nopmd 0.1.0
+# Packages page 111
+nova 0.10.2
+nova_modern 0.1.3
+nprocreg 0.3.0
+ns 1.6.4
+nuntius 1.0.0
+oauth 2.1.0
+oauth2c 1.0.1
+oauth2_erlang 0.6.1
+# Packages page 112
+observer_cli 1.8.0
+oc_datadog 0.2.0
+oc_google_reporter 0.4.0
+odi 0.1.0
+oidcc 3.2.6
+oidcc_cowboy 2.0.0
+oidcc_cowboy_session 2.0.0
+ojson 1.0.0
+# Packages page 113
+oox 0.1.27
+opcua 0.1.0
+opencensus 0.9.3
+opencensus_cowboy 0.3.0
+opencensus_elli 0.4.0
+opencensus_erlang_prometheus 0.3.2
+opencensus_jaeger 0.0.1
+opencensus_service 0.1.0
+opencensus_telemetry 0.1.0
+opencensus_zipkin 0.3.0
+# Packages page 114
+openroad 1.0.0
+opentelemetry 1.5.0
+opentelemetry_api 1.4.0
+opentelemetry_api_experimental 0.5.1
+opentelemetry_cowboy 1.0.0
+opentelemetry_elli 0.2.0
+opentelemetry_experimental 0.5.1
+opentelemetry_exporter 1.8.0
+opentelemetry_grpcbox 0.2.0
+opentelemetry_heroku 0.2.0
+opentelemetry_instrumentation_http 0.1.0
+opentelemetry_logger_metadata 0.1.0
+opentelemetry_logger_metadata_datadog 0.1.0
+opentelemetry_process_propagator 0.3.0
+opentelemetry_semantic_conventions 1.27.0
+opentelemetry_telemetry 1.1.2
+opentelemetry_xray 0.7.3
+opentelemetry_zipkin 1.1.1
+optic 3.1.0
+opuntia 1.1.0
+# Packages page 115
+ordered_mutex 0.1.2
+osc_lib 2.1.1
+osc_server 2.1.1
+otc 1.0.0
+otel_http 0.2.0
+otel_propagator_instana 1.1.0
+otpbp 7.6.0
+otpcl 0.2.0
+otp_passage 0.1.10
+otp_vsn 2.11.0
+otter 0.4.0
+otter_lib 0.1.1
+otters 0.2.10
+otter_srv 0.1.0
+overworld 2.0.0
+ovsdb 0.3.0
+owoify_erl 1.1.2
+p1_acme 1.0.24
+p1_mysql 1.0.25
+p1_oauth2 0.6.14
+p1_pgsql 1.1.28
+p1_stringprep 1.0.1
+p1_utils 1.0.26
+p1_xml 1.1.1
+p1_xmlrpc 1.15.1
+# Packages page 116
+pact_erlang 0.2.2
+paillier 1.0.0
+# Packages page 117
+parse_trans 3.4.2
+parsexml 1.0.0
+parthenon 0.10.1
+partial 1.2.0
+partisan 5.0.0-rc.8
+passage 0.2.6
+pbkdf2 2.0.0
+pbkdf2_nif 0.4.0
+pc 1.15.0
+pcsc 1.3.1
+pd_erlzk 0.6.4
+pe4kin 0.2.4
+# Packages page 118
+perc 1.0.2
+pest 0.9.0
+pfcplib 3.0.0
+pgapp 0.0.2
+pge 0.2.6
+pgo 0.14.0
+pgpool 2.1.0
+pgsql 26.0.2
+pg_types 0.4.0
+# Packages page 119
+# Packages page 120
+phpass 0.1.0
+phrase 0.2.1
+# Packages page 121
+picosat 0.1.0
+pipe_line 1.0.0
+pipes 2.0.1
+# Packages page 122
+pkix 1.0.10
+pkt 0.6.0
+pl 18.1.31
+plain_fsm 1.4.5
+platybelodon 0.1.0
+plists 1.1.1
+plottah 0.2.0
+plugerl 1.0.0
+# Packages page 123
+# Packages page 124
+plumtree 0.6.0
+pmbag 1.0.0
+pmod_transform 1.1.0
+png 0.2.1
+pobox 1.2.0
+poise 0.2.0
+# Packages page 125
+poolboy 1.5.2
+pooler 1.6.0
+poolgirl 1.3.0
+pop3client 1.4.0
+porter_stemming 1.0.1
+posthaste 18.10.14
+postman_smtp 0.0.1
+postman_transport 1.0.0
+pot 1.0.2
+power_shell 1.3.0
+ppg 0.1.3
+ppool 1.1.1
+ppplib 1.0.0
+pp_record 0.1.3
+pqclean 0.0.3
+pqueue 2.0.7
+# Packages page 126
+pretty_print 0.1.0
+priq 0.2.0
+proc 1.1.2
+process_group 1.1.3
+procket 0.9.9
+proj_nif 0.1.4
+prometheus 4.11.0
+prometheus_cowboy 0.1.8
+prometheus_diameter_collector 1.2.1
+# Packages page 127
+prometheus_httpd 2.1.11
+prometheus_process_collector 1.6.0
+promexp 0.4.3
+proper 1.4.0
+proper_contrib 0.3.2
+protofy_test 1.0.0
+provider_asn1 0.4.1
+providers 1.9.0
+prx 0.16.4
+pulserl 0.1.3
+# Packages page 128
+pure_migrations 1.3.0
+pushover_error_logger 0.1.0
+pynchon 0.5.0
+qdate 0.7.3
+qdate_localtime 1.2.1
+qsp 0.1.0
+quantile_estimator 0.2.1
+# Packages page 129
+quicer 0.0.308
+quickrand 2.0.7
+quintana 0.2.2
+ra 2.16.0-pre.2
+raabta 0.1.0
+rabbit_common 4.0.3
+radius 0.0.13
+ram 0.5.0
+# Packages page 130
+ranch 2.1.0
+ranch_proxy_protocol 2.1.1
+rand_compat 0.0.3
+rand_str 1.0.1
+rankmatcher 0.1.6
+raterl 0.3.1
+rationals 0.2.0
+raven_erlang 0.4.3
+raw_sqlite3 1.0.10
+# Packages page 131
+rcl_bench 0.1.0
+rcl_test 0.2.0
+re2 1.9.8
+realpath 1.3.6
+rebar3_abnf_compiler 0.1.3
+rebar3_applications_plugin 1.0.1
+rebar3_appup_plugin 2.4.6
+rebar3_archive_plugin 0.0.2
+rebar3_asn1_compiler 1.0.0
+rebar3_auto 0.5.1
+rebar3_auto_applications 1.0.0
+rebar3_autotdd 1.1.0
+rebar3_autotest 0.1.1
+rebar3_bench 0.3.0
+rebar3_bitbake 0.1.0
+rebar3_bump 0.1.1
+rebar3_cargo 0.1.1
+rebar3_check_app_calls 0.1.2
+rebar3_check_deps 0.1.0
+rebar3_checkshell 1.2.0
+rebar3_clojerl 0.8.8
+rebar3_cobertura 0.3.1
+rebar3_codecov 0.7.0
+rebar3_cuttlefish 0.16.0
+rebar3_deb 0.1.1
+rebar3_depup 0.4.0
+rebar3_dialyzer_html 0.3.0
+rebar3_diameter_compiler 0.8.0
+rebar3_dirs 0.1.0
+rebar3_docker 0.2.0
+rebar3_docs 0.2.1
+rebar3_dragon 0.0.0
+rebar3_edata_plugin 0.1.11
+rebar3_edoc_extensions 1.6.1
+rebar3_eep48 0.1.0
+rebar3_eetcd_plugin 0.3.2
+rebar3_efene 0.1.1
+rebar3_efene_compile 0.2.0
+rebar3_efene_ct 0.1.2
+rebar3_efene_shell 0.1.2
+rebar3_efmt 0.18.3
+rebar3_elixir 0.2.4
+rebar3_elixirc 0.1.0
+rebar3_elixir_compile 1.1.0
+rebar3_elixir_plugin 2.0.0
+rebar3_elvis_plugin 0.0.4
+rebar3_eqc 1.3.0
+rebar3_erlesy 1.0.0
+rebar3_erllambda 1.1.2
+rebar3_erlquery 0.2.2
+rebar3_erlydtl_plugin 0.1.1
+# Packages page 132
+rebar3_ex_doc 0.2.24
+rebar3_external 0.2.0
+rebar3_exunit 0.1.1
+rebar3_fmt 1.19.0
+rebar3_format 1.3.0
+rebar3_git_vsn 1.1.1
+rebar3_gpb_plugin 2.23.2
+rebar3_gpb_rpc_plugin 1.3.1
+rebar3_grisp 2.8.0
+rebar3_grisp_io 0.1.0
+rebar3_hank 1.4.1
+rebar3_hex 7.0.8
+rebar3_hterl 0.2.0
+rebar3_idl_compiler 0.5.0
+rebar3_jorel 0.0.1
+rebar3_lfe 0.4.11
+rebar3_lfe_clean 0.4.0-rc2
+rebar3_lfe_compile 0.8.0-rc3
+rebar3_lfe_test 0.4.0-rc4
+rebar3_lfe_version 0.5.0-rc2
+rebar3_lint 3.2.6
+rebar3_local_deps 0.1.2
+rebar3_neotoma_plugin 0.2.0
+rebar3_nova 0.4.5
+rebar3_oscmd 0.5.0
+rebar3_path_deps 0.4.0
+rebar3_project_utils 0.1.0
+rebar3_proper 0.12.1
+rebar3_protobuffs 0.2.0
+rebar3_proto_plugin 0.1.15
+rebar3_raw_deps 2.0.0
+rebar3_rdl 0.1.0
+rebar3_reloader 0.2.0
+rebar3_run 0.5.0
+rebar3_rustler 0.1.1
+rebar3_sbom 0.8.0
+rebar3_scuttler 0.4.1
+rebar3_sheldon 0.4.3
+rebar3_shellcheck 1.0.1
+rebar3_shellrpc 0.1.0
+rebar3_sqlc 0.1.0
+rebar3_static_deps 2021.1.0
+rebar3_tailwind 1.0.3
+rebar3_tsung 0.1.4
+rebar3_typer 0.1.1
+rebar3_undertone 0.1.0-rc1
+rebar3_vendor 0.4.0
+rebar3_yang_plugin 0.2.1
+rebar3_zig 2022.1.0
+rebar_alias 0.2.0
+rebar_cmd 0.4.0
+rebar_covertool 1.3.0
+rebar_edown_plugin 0.7.0
+rebar_eqc 0.1.0
+rebar_erl_vsn 0.2.2
+rebar_gleam 0.2.0
+rebar_mix 0.5.1
+rebar_protobuffs 0.1.0
+rebar_prv_mlfe 0.3.0
+rebar_raw_resource 0.11.0
+recompile 0.1.0
+recon 2.5.6
+recordset 0.1.0
+redbug 2.1.0
+# Packages page 133
+redbug_clone 2.0.10
+redis_global 0.0.8
+reg 0.1.0
+regine 1.1.0
+regis 1.0.0
+rekt 0.1.0
+relflow 1.0.6
+relsync 0.1.1
+relsyncd 0.1.2
+relsync_lib 0.1.1
+# Packages page 134
+reltool_util 2.0.7
+relx 4.10.0
+remedy_cowlib 2.11.1
+remedy_gun 2.0.1
+replayq 0.3.10
+repo 0.7.2
+rest 6.11.1
+restc 0.4.1
+# Packages page 135
+resulto 0.2.1
+results 0.2.0
+re_tuner 0.1.21
+rfc3394 1.0.1
+riakc 2.5.3
+riak_client 2.5.3
+riak_core_lite 0.10.4
+riak_core_lite_util 0.1.2
+riak_core_ng 3.1.1
+riak_core_ng_up 2.2.9
+riak_dt 2.1.1
+riak_ensemble 2.1.3
+riak_ensemble_ng 2.4.4
+riak_pb 2.3.2
+riak_sysmon 2.1.7
+riax_hut 1.3.0
+ringbuffer 1.2.0
+# Packages page 136
+rlamb_publishtest 0.1.0
+rlp 1.1.0
+rmpc 18.5.9
+robots 1.1.2
+rocksdb 1.8.0
+rocksdb_cloud 1.0.1
+roni 1.0.1
+roster 3.4.0
+router 1.0.4
+routing_tree 1.0.9
+rpsls 1.0.0
+# Packages page 137
+rs_compile 0.1.0
+rsrc_pool 1.0.3
+rstats 1.0.4
+rtmpmsg 0.2.16
+rtrace 1.0.1-6.bc1a170
+ruapu 0.1.0
+s3filez 1.4.1
+safeio 0.1.6
+safetyvalve 2.5.2
+salt 0.1.3
+samovar 1.0.2
+# Packages page 138
+sanitizer 0.0.2
+sasl_auth 2.3.3
+sbroker 1.0.0
+scheduler_utilization 0.1.1
+# Packages page 139
+scran 0.2.0
+scrypt 2.1.0
+# Packages page 140
+segmented_cache 0.4.0
+self_configer 0.1.1
+semver_erl 0.0.1
+serial_framing_protocol 1.1.0
+serverless 0.4.3
+seshat 0.6.0
+setup 2.2.0
+# Packages page 141
+sext 1.9.0
+sfmt 0.14.0
+sf_transform 0.3.1
+sgi 0.6.0
+sha3 2.0.0
+shackle 0.6.15
+shards 1.1.1
+sheldon 0.4.1
+shiguredo_crdt 2022.1.0
+shiguredo_jesse 2024.1.0
+shiguredo_jsone 2024.1.0
+shiguredo_redbug 2022.2.0
+shiguredo_riak_dt 2022.1.0
+shiguredo_sync 2022.1.0
+shine 0.1.0
+shot 1.1.1
+shotgun 1.1.0
+shq 0.1.1
+# Packages page 142
+sidejob 2.2.0
+sigma_proplist 0.1.0
+simdjson 0.1.3
+simdjsone 0.4.2
+simple_bridge 2.3.1
+simple_cache 1.2.0
+simple_global 0.1.4
+# Packages page 143
+simpler_cowboy_rest 1.0.0
+simpre 0.1.0
+# Packages page 144
+sleeplocks 1.1.3
+slugerl 1.0.0
+small_ints 0.1.0
+smerl 0.0.1
+smokkfiskur 0.1.4
+snabbkaffe 1.0.10
+snapperl 1.1.3
+snappiest 1.2.0
+snappy 1.1.1
+snappyer 1.2.10
+snappy_nif 1.1.3
+# Packages page 145
+snatch 0.4.6
+snatch_php 0.2.1
+snatch_test_framework 0.6.4
+sntrup761_nif 1.0.0
+sockerl 17.9.10
+soda 1.1.1
+soos_sample_project 1.0.0
+soxe 0.1.1
+# Packages page 146
+sparkler 0.2.0
+spartan 0.0.1
+spellerl 1.0.1
+spg 1.1.1
+sphinxsearch_giza 0.0.2
+spi 0.5.0
+spillway 1.3.0
+spinlock 0.2.1
+splay_tree 1.1.0
+splicer 0.5.5
+# Packages page 147
+sql_bridge 0.5.0
+sqlc 0.1.0
+sqlite 2.0.0
+sqlite3 1.1.15
+sqlmig 0.1.5
+sqlparse 4.6.3
+sqlparser 0.3.1
+srly 0.6.5
+ssh_agent 0.1.0
+ssh_signature 0.1.0
+ssl_verify_fun 1.1.7
+stacktrace_compat 1.2.2
+stage 0.3.0
+# Packages page 148
+statman 0.5.0
+statsderl 0.6.1
+statsig 0.0.3
+st_commons 1.2.1
+stdout_formatter 0.2.4
+steady_vector 1.0.1
+steamroller 0.14.3
+stillir 1.1.0
+stk500 0.2.2
+# Packages page 149
+stout 1.0.0
+strata 0.1.0
+strata_mysql 0.1.0
+strata_postgres 0.1.0
+strata_sqlite3 0.1.0
+stream 0.1.0
+strftimerl 0.1.2
+string_compat 0.0.1
+stringprep 1.0.30
+string_utils 1.1.3
+# Packages page 150
+stun 1.2.15
+subtree 0.1.0
+sui 0.1.0
+sumo_db 0.7.7
+sumo_db_mysql 0.0.2
+sumo_db_pgsql 0.2.0
+sumo_db_riak 0.1.0
+sumo_rest 0.3.4
+supervisor3 1.1.12
+supool 2.0.7
+surreal 2.1.0
+# Packages page 151
+sut 0.2.0
+swab 1.0.4
+swear 1.0.0
+swidden 2024.2.0
+switchboard 0.3.2
+syn 3.3.0
+sync 0.4.1
+syslog 1.1.0
+syslog_app 4.0.0
+syslogger 0.3.0
+syslog_socket 2.0.7
+sysmon_handler 1.3.0
+systemd 0.6.2
+system_monitor 1.0.1
+t__ 0.1.0
+# Packages page 152
+tasker 0.1.0
+taskforce 1.2.3
+task_graph 0.3.1
+tbcd 0.3.6
+tcp_client 0.3.0
+tdata 1.1.3
+tdiff 0.1.2
+teacup 0.3.4
+# Packages page 153
+teacup_nats 0.4.1
+telemetry 1.3.0
+telemetry_poller 1.1.0
+telemetry_registry 0.3.2
+teleport 0.6.2
+teleprom 0.1.0
+telex 0.0.2
+template_compiler 2.10.1
+templaterl 0.2.4
+tempo 0.4.4
+# Packages page 154
+termbox2 0.1.2
+termcap 0.1.0
+termit 2.0.1
+termseal 0.1.1
+tesla_api 1.0.0
+test_hex 1.1.2
+test_package 1.0.0
+test_package_nogit 1.0.0
+testutils 0.0.1
+test_utils 1.1.1
+# Packages page 155
+textual 0.1.1
+tflite_beam 0.3.7
+the_f 1.0.0
+thoas 1.2.1
+thrift_erl 0.13.0
+thrift_protocol 0.1.5
+throwdown 0.2.1
+time_compat 0.0.1
+time_utils 1.0.15
+# Packages page 156
+tivan 1.2.15
+tivan_rocksdb 1.0.0
+tls_certificate_check 1.24.0
+tomerl 0.5.0
+toml_bombadil 0.4.0
+# Packages page 157
+totp 0.0.3
+tqformat 0.1.4
+tql 1.10.0
+tracelog 0.1.0
+trace_runner 1.0.0
+traces 1.0.4
+trails 2.3.1
+travianmap 1.1.0
+# Packages page 158
+treewalker 0.4.1
+trie 2.0.7
+triq 1.3.0
+trooper 0.3.2
+ts_chatterbox 0.15.1
+tsuru 1.4.1
+tunctl 0.3.5
+tunnerl 1.3.0
+# Packages page 159
+twilio_sms 0.1.1
+typerefl 0.1.1
+types 0.1.8
+u2f 0.1.5
+ua_classifier 1.0.0
+ucl 1.1.1
+ucol 2.0.0
+ucol_nif 1.1.5
+# Packages page 160
+# Packages page 161
+uef 2.6.0
+uf2tool 1.1.0
+ui 0.1.1
+uid 1.3.4
+ulitos 0.4.0
+undermidi 0.1.0
+undertheory 0.3.0
+undertone 0.4.0-rc3
+undertone_lib 0.4.0-rc3
+unicode_util_compat 0.7.0
+unistring 0.1.0
+unite 0.4.3
+# Packages page 162
+uri 0.1.0
+urilib 0.5.0
+url 1.1.0
+usb 0.2.0
+util 1.3.4
+utility 0.1.2
+uuid_erl 2.0.7
+uuidv4 1.0.0
+validerl 2.0.1
+# Packages page 163
+varpool 2.0.7
+vd_inet_ext 0.4.1
+vd_pkt 0.4.5
+vectorclock 0.2.0
+vegrandis 3.1.1
+vent 0.4.2
+verhoeff 0.1.2
+verl 1.1.1
+verx 0.5.4
+vice 0.1.0
+# Packages page 164
+vincenty 1.0.0
+vmq_commons 1.0.0
+vmstats 2.4.0
+vptree 0.0.0
+vsn 1.1.0
+wait_helper 0.2.1
+# Packages page 165
+watch 0.2.2
+webdavfilez 1.2.1
+webmachine 1.11.1
+webpage 1.0.0
+websocket_client 1.5.0
+# Packages page 166
+wirerlhair 1.0.0
+wms 0.10.0
+wolff 4.0.4
+wooper 2.0.9
+# Packages page 167
+worker_pool 6.4.0
+workforce 0.1.0
+world_geojson 0.0.1
+wts 0.4.0
+xlerl 0.1.0
+# Packages page 168
+xml_builderl 0.1.0
+xmlrat 0.0.10
+xmpp 1.9.0
+xorf 1.0.0
+xpath 1.0.2
+xprof 2.0.0-rc.5
+xprof_core 2.0.0-rc.5
+xprof_gui 2.0.0-rc.5
+xqerl 0.2.0
+xqerl_merge_index 2.1.0
+xrepl 0.0.0
+xs_regex 0.1.0
+xtea 0.1.2
+xxh3 0.3.6
+yabko 1.0.0
+yaccety_sax 0.3.0
+yamerl 0.10.0
+yamerl_the_fork 0.3.3
+# Packages page 169
+yconf 1.0.16
+yctest 1.2.0
+yes_msg 0.1.0
+yubico 0.1.5
+yval 1.0.10
+zen 0.1.0
+# Packages page 170
+zipper 1.1.0
+zlist 1.3.0
+zlists 0.0.4
+zotonic_apps 1.0.0-rc.15
+zotonic_core 1.0.0-rc.15
+zotonic_filehandler 1.0.0-rc.15
+zotonic_fileindexer 1.0.0-rc.15
+zotonic_filewatcher 1.0.0-rc.15
+zotonic_launcher 1.0.0-rc.15
+zotonic_listen_http 1.0.0-rc.15
+zotonic_listen_mqtt 1.0.0-rc.15
+zotonic_listen_smtp 1.0.0-rc.15
+zotonic_mod_acl_mock 1.0.0-d1
+zotonic_mod_acl_user_groups 1.0.0-rc.15
+zotonic_mod_admin 1.0.0-rc.15
+zotonic_mod_admin_category 1.0.0-rc.15
+zotonic_mod_admin_config 1.0.0-rc.15
+zotonic_mod_admin_frontend 1.0.0-rc.15
+zotonic_mod_admin_identity 1.0.0-rc.15
+zotonic_mod_admin_merge 1.0.0-rc.15
+zotonic_mod_admin_modules 1.0.0-rc.15
+zotonic_mod_admin_predicate 1.0.0-rc.15
+zotonic_mod_admin_statistics 1.0.0-rc.15
+zotonic_mod_artwork 1.0.0-rc.15
+zotonic_mod_audio 1.0.0-rc.15
+zotonic_mod_auth2fa 1.0.0-rc.15
+zotonic_mod_authentication 1.0.0-rc.15
+zotonic_mod_backup 1.0.0-rc.15
+zotonic_mod_base 1.0.0-rc.15
+zotonic_mod_bootstrap 1.0.0-rc.15
+zotonic_mod_clamav 1.0.0-rc.15
+zotonic_mod_comment 1.0.0-rc.15
+zotonic_mod_contact 1.0.0-rc.15
+zotonic_mod_content_groups 1.0.0-rc.15
+zotonic_mod_cookie_consent 1.0.0-rc.15
+zotonic_mod_cron 1.0.0-rc.15
+zotonic_mod_custom_redirect 1.0.0-rc.15
+zotonic_mod_development 1.0.0-rc.15
+zotonic_mod_ducklog 0.2.0
+zotonic_mod_editor_tinymce 1.0.0-rc.15
+zotonic_mod_email_dkim 1.0.0-rc.15
+zotonic_mod_email_receive 1.0.0-rc.15
+zotonic_mod_email_relay 1.0.0-rc.15
+zotonic_mod_email_status 1.0.0-rc.15
+zotonic_mod_export 1.0.0-rc.15
+zotonic_mod_facebook 1.0.0-rc.15
+zotonic_mod_filestore 1.0.0-rc.15
+zotonic_mod_fileuploader 1.0.0-rc.15
+zotonic_mod_geoip 1.0.0-rc.15
+zotonic_mod_image_edit 1.0.0-rc.15
+zotonic_mod_import_csv 1.0.0-rc.15
+zotonic_mod_import_wordpress 1.0.0-rc.15
+zotonic_mod_l10n 1.0.0-rc.15
+zotonic_mod_linkedin 1.0.0-rc.15
+zotonic_mod_logging 1.0.0-rc.15
+zotonic_mod_mailinglist 1.0.0-rc.15
+zotonic_mod_media_exif 1.0.0-rc.15
+zotonic_mod_menu 1.0.0-rc.15
+zotonic_mod_microsoft 1.0.0-rc.15
+zotonic_mod_mqtt 1.0.0-rc.15
+zotonic_mod_oauth2 1.0.0-rc.15
+zotonic_mod_oembed 1.0.0-rc.15
+zotonic_mod_ratelimit 1.0.0-rc.15
+zotonic_mod_search 1.0.0-rc.15
+zotonic_mod_seo 1.0.0-rc.15
+zotonic_mod_seo_sitemap 1.0.0-rc.15
+zotonic_mod_server_storage 1.0.0-rc.15
+zotonic_mod_signup 1.0.0-rc.15
+zotonic_mod_site_update 1.0.0-rc.15
+zotonic_mod_ssl_ca 1.0.0-rc.15
+zotonic_mod_ssl_letsencrypt 1.0.0-rc.15
+zotonic_mod_survey 1.0.0-rc.15
+zotonic_mod_syslog 1.0.0-rc.15
+zotonic_mod_tkvstore 1.0.0-rc.15
+zotonic_mod_translation 1.0.0-rc.15
+# Packages page 171
+zotonic_mod_twitter 1.0.0-rc.15
+zotonic_mod_video 1.0.0-rc.15
+zotonic_mod_video_embed 1.0.0-rc.15
+zotonic_mod_wires 1.0.0-rc.15
+zotonic_mod_zotonic_site_management 1.0.0-rc.15
+zotonic_notifier 1.0.0-rc.15
+zotonic_rdf 1.1.0
+zotonic_site_status 1.0.0-rc.15
+zotonic_ssl 1.3.0
+zotonic_stdlib 1.21.0
+zstd 0.2.0
+zucchini 0.1.0
+# Packages page 172
diff --git a/test/plugin_asciidoc.mk b/test/plugin_asciidoc.mk
index 29dfd07..b2240ce 100644
--- a/test/plugin_asciidoc.mk
+++ b/test/plugin_asciidoc.mk
@@ -1,10 +1,10 @@
# AsciiDoc plugin.
-ASCIIDOC_TARGETS = $(call list_targets,asciidoc)
+asciidoc_TARGETS = $(call list_targets,asciidoc)
-.PHONY: asciidoc $(ASCIIDOC_TARGETS)
+.PHONY: asciidoc $(asciidoc_TARGETS)
-asciidoc: $(ASCIIDOC_TARGETS)
+asciidoc: $(asciidoc_TARGETS)
# Disable the Asciidoc tests requiring the DocBook toolchain
# when Asciidoc is not installed. The toolchain is too heavy for CI.
diff --git a/test/plugin_bootstrap.mk b/test/plugin_bootstrap.mk
index 7093fce..aa873a8 100644
--- a/test/plugin_bootstrap.mk
+++ b/test/plugin_bootstrap.mk
@@ -1,10 +1,10 @@
# Bootstrap plugin.
-BOOTSTRAP_TARGETS = $(call list_targets,bootstrap)
+bootstrap_TARGETS = $(call list_targets,bootstrap)
-.PHONY: bootstrap $(BOOTSTRAP_TARGETS)
+.PHONY: bootstrap $(bootstrap_TARGETS)
-bootstrap: $(BOOTSTRAP_TARGETS)
+bootstrap: $(bootstrap_TARGETS)
bootstrap-app: init
@@ -303,13 +303,16 @@ bootstrap-templates: init
$t $(MAKE) -C $(APP) --no-print-directory new t=gen_statem n=my_statem
$t $(MAKE) -C $(APP) --no-print-directory new t=gen_server n=my_server
$t $(MAKE) -C $(APP) --no-print-directory new t=supervisor n=my_sup
- $t $(MAKE) -C $(APP) --no-print-directory new t=cowboy_http n=my_http
- $t $(MAKE) -C $(APP) --no-print-directory new t=cowboy_loop n=my_loop
- $t $(MAKE) -C $(APP) --no-print-directory new t=cowboy_rest n=my_rest
- $t $(MAKE) -C $(APP) --no-print-directory new t=cowboy_ws n=my_ws
+ $t $(MAKE) -C $(APP) --no-print-directory new t=cowboy_http_h n=my_http_h
+ $t $(MAKE) -C $(APP) --no-print-directory new t=cowboy_loop_h n=my_loop_h
+ $t $(MAKE) -C $(APP) --no-print-directory new t=cowboy_rest_h n=my_rest_h
+ $t $(MAKE) -C $(APP) --no-print-directory new t=cowboy_websocket_h n=my_ws_h
$t $(MAKE) -C $(APP) --no-print-directory new t=ranch_protocol n=my_protocol
$t $(MAKE) -C $(APP) --no-print-directory new t=module n=my_module
+ $i "Confirm we can't overwrite existing files"
+ $t ! $(MAKE) -C $(APP) --no-print-directory new t=gen_server n=my_server $v
+
# Here we disable warnings because templates contain missing behaviors.
$i "Build the application"
$t $(MAKE) -C $(APP) ERLC_OPTS=+debug_info $v
@@ -320,12 +323,17 @@ bootstrap-templates: init
$t test -f $(APP)/ebin/my_statem.beam
$t test -f $(APP)/ebin/my_server.beam
$t test -f $(APP)/ebin/my_sup.beam
+ $t test -f $(APP)/ebin/my_http_h.beam
+ $t test -f $(APP)/ebin/my_loop_h.beam
+ $t test -f $(APP)/ebin/my_rest_h.beam
+ $t test -f $(APP)/ebin/my_ws_h.beam
+ $t test -f $(APP)/ebin/my_protocol.beam
$t test -f $(APP)/ebin/my_module.beam
$i "Check that all the modules can be loaded"
$t $(ERL) -pa $(APP)/ebin/ -eval " \
ok = application:start($(APP)), \
- {ok, Mods = [my_fsm, my_http, my_loop, my_module, my_protocol, my_rest, my_server, my_statem, my_sup, my_ws]} \
+ {ok, Mods = [my_fsm, my_http_h, my_loop_h, my_module, my_protocol, my_rest_h, my_server, my_statem, my_sup, my_ws_h]} \
= application:get_key($(APP), modules), \
[{module, M} = code:load_file(M) || M <- Mods], \
halt()"
diff --git a/test/plugin_c_src.mk b/test/plugin_c_src.mk
index eeee445..5330452 100644
--- a/test/plugin_c_src.mk
+++ b/test/plugin_c_src.mk
@@ -1,16 +1,18 @@
# C source plugin.
-C_SRC_TARGETS = $(call list_targets,c-src)
+c_src_TARGETS = $(call list_targets,c-src)
-.PHONY: c-src $(C_SRC_TARGETS)
+.PHONY: c-src $(c_src_TARGETS)
-c-src: $(C_SRC_TARGETS)
+c-src: $(c_src_TARGETS)
c_src: c-src
ifeq ($(PLATFORM),msys2)
-C_SRC_OUTPUT_EXECUTABLE_EXTENSION = .dll
+C_SRC_OUTPUT_SHARED_EXTENSION = .dll
+C_SRC_OUTPUT_STATIC_EXTENSION = .lib
else
-C_SRC_OUTPUT_EXECUTABLE_EXTENSION = .so
+C_SRC_OUTPUT_SHARED_EXTENSION = .so
+C_SRC_OUTPUT_STATIC_EXTENSION = .a
endif
c-src-makefile-change: init
@@ -32,7 +34,7 @@ c-src-makefile-change: init
$(APP)/c_src/$(APP).o \
$(APP)/ebin/$(APP).app \
$(APP)/ebin/$(APP).beam \
- $(APP)/priv/$(APP)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION) \
+ $(APP)/priv/$(APP)$(C_SRC_OUTPUT_SHARED_EXTENSION) \
$(APP)/src/$(APP).erl | sort > $(APP)/EXPECT
$t $(SLEEP)
$t touch $(APP)/Makefile
@@ -60,7 +62,7 @@ c-src-nif: init
$t test -f $(APP)/c_src/env.mk
$t test -f $(APP)/ebin/$(APP).app
$t test -f $(APP)/ebin/$(APP).beam
- $t test -f $(APP)/priv/$(APP)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+ $t test -f $(APP)/priv/$(APP)$(C_SRC_OUTPUT_SHARED_EXTENSION)
$i "Check that the application was compiled correctly"
$t $(ERL) -pa $(APP)/ebin/ -eval " \
@@ -81,7 +83,7 @@ c-src-nif: init
$t test -f $(APP)/c_src/env.mk
$t test -f $(APP)/ebin/$(APP).app
$t test -f $(APP)/ebin/$(APP).beam
- $t test -f $(APP)/priv/$(APP)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+ $t test -f $(APP)/priv/$(APP)$(C_SRC_OUTPUT_SHARED_EXTENSION)
$i "Check that the application was compiled correctly"
$t $(ERL) -pa $(APP)/ebin/ -eval " \
@@ -101,7 +103,7 @@ c-src-nif: init
$t test ! -e $(APP)/c_src/$(APP).o
$t test ! -e $(APP)/ebin/$(APP).app
$t test ! -e $(APP)/ebin/$(APP).beam
- $t test ! -e $(APP)/priv/$(APP)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+ $t test ! -e $(APP)/priv/$(APP)$(C_SRC_OUTPUT_SHARED_EXTENSION)
$i "Distclean the application"
$t $(MAKE) -C $(APP) distclean $v
@@ -118,3 +120,60 @@ c-src-nif-missing-name: init
$i "Try to generate a NIF without giving it a name"
$t ! $(MAKE) -C $(APP) new-nif $v
+
+c-src-static-nif: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Generate a NIF from templates"
+ $t $(MAKE) -C $(APP) new-nif n=$(APP) $v
+
+ $i "Set C_SRC_TYPE = static in the Makefile"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "C_SRC_TYPE = static\n"}' $(APP)/Makefile
+
+ $i "Build the application"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that all compiled files exist"
+ $t test -f $(APP)/$(APP).d
+ $t test -f $(APP)/c_src/$(APP).o
+ $t test -f $(APP)/c_src/env.mk
+ $t test -f $(APP)/ebin/$(APP).app
+ $t test -f $(APP)/ebin/$(APP).beam
+ $t test -f $(APP)/priv/$(APP)$(C_SRC_OUTPUT_STATIC_EXTENSION)
+
+ $i "Check that the library file contains the expected functions"
+ $t objdump -t $(APP)/priv/test_c_src_static_nif.a | grep -c hello | grep -q 1
+
+ $i "Re-build the application"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that all compiled files exist"
+ $t test -f $(APP)/$(APP).d
+ $t test -f $(APP)/c_src/$(APP).o
+ $t test -f $(APP)/c_src/env.mk
+ $t test -f $(APP)/ebin/$(APP).app
+ $t test -f $(APP)/ebin/$(APP).beam
+ $t test -f $(APP)/priv/$(APP)$(C_SRC_OUTPUT_STATIC_EXTENSION)
+
+ $i "Check that the library file contains the expected functions"
+ $t objdump -t $(APP)/priv/test_c_src_static_nif.a | grep -c hello | grep -q 1
+
+ $i "Clean the application"
+ $t $(MAKE) -C $(APP) clean $v
+
+ $i "Check that all intermediate files were removed"
+ $t test ! -e $(APP)/$(APP).d
+ $t test ! -e $(APP)/c_src/$(APP).o
+ $t test ! -e $(APP)/ebin/$(APP).app
+ $t test ! -e $(APP)/ebin/$(APP).beam
+ $t test ! -e $(APP)/priv/$(APP)$(C_SRC_OUTPUT_STATIC_EXTENSION)
+
+ $i "Distclean the application"
+ $t $(MAKE) -C $(APP) distclean $v
+
+ $i "Check that all files were removed"
+ $t test ! -e $(APP)/c_src/env.mk
diff --git a/test/plugin_concuerror.mk b/test/plugin_concuerror.mk
index f1b9288..5bd4231 100644
--- a/test/plugin_concuerror.mk
+++ b/test/plugin_concuerror.mk
@@ -1,10 +1,10 @@
# Concuerror plugin.
-CONCUERROR_TARGETS = $(call list_targets,concuerror)
+concuerror_TARGETS = $(call list_targets,concuerror)
-.PHONY: concuerror $(CONCUERROR_TARGETS)
+.PHONY: concuerror $(concuerror_TARGETS)
-concuerror: $(CONCUERROR_TARGETS)
+concuerror: $(concuerror_TARGETS)
concuerror-app: init
diff --git a/test/plugin_cover.mk b/test/plugin_cover.mk
index a1d7e51..0883fa0 100644
--- a/test/plugin_cover.mk
+++ b/test/plugin_cover.mk
@@ -1,10 +1,10 @@
# Common Test plugin.
-COVER_TARGETS = $(call list_targets,cover)
+cover_TARGETS = $(call list_targets,cover)
-.PHONY: cover $(COVER_TARGETS)
+.PHONY: cover $(cover_TARGETS)
-cover: $(COVER_TARGETS)
+cover: $(cover_TARGETS)
cover-ct: init
@@ -33,6 +33,34 @@ cover-ct: init
$t test ! -e $(APP)/cover/ct.coverdata
$t test ! -e $(APP)/test/ct.cover.spec
+cover-ct-excl-mods: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Add supervisor module to the cover exclude module list "
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "COVER_EXCLUDE_MODS = $(APP)_sup \n"}' $(APP)/Makefile
+
+ $i "Generate a Common Test suite"
+ $t mkdir $(APP)/test
+ $t printf "%s\n" \
+ "-module($(APP)_SUITE)." \
+ "-export([all/0, ok/1])." \
+ "all() -> [ok]." \
+ "ok(_) -> application:start($(APP))." > $(APP)/test/$(APP)_SUITE.erl
+
+ $i "Run Common Test with code coverage enabled"
+ $t $(MAKE) -C $(APP) ct COVER=1 $v
+
+ $i "Check that the generated files exist"
+ $t test -f $(APP)/cover/ct.coverdata
+ $t test -f $(APP)/test/ct.cover.spec
+
+ $i "Check that the supervisor module is not included in the cover report"
+ $t ! test -e $(APP)/logs/ct_run.*/$(APP)_sup.COVER.html
+
cover-ct-incl-apps: init
$i "Bootstrap a new OTP application named $(APP)"
@@ -123,8 +151,8 @@ cover-ct-incl-deps: init
$t cp ../erlang.mk $(APP)/
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
- $i "Add Cowboy 1.0.0 to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy_commit = 1.0.0\n"}' $(APP)/Makefile
+ $i "Add Cowboy 2.12.0 to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy_commit = 2.12.0\n"}' $(APP)/Makefile
ifdef LEGACY
$i "Add Cowboy to the applications key in the .app.src file"
@@ -150,6 +178,33 @@ endif
$t test -f $(APP)/logs/ct_run.*/cow_http_hd.COVER.html
$t ! test -e $(APP)/logs/ct_run.*/ranch_app.COVER.html
+cover-ct-single-suite: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Generate a Common Test suite"
+ $t mkdir $(APP)/test
+ $t printf "%s\n" \
+ "-module($(APP)_SUITE)." \
+ "-export([all/0, ok/1])." \
+ "all() -> [ok]." \
+ "ok(_) -> application:start($(APP))." > $(APP)/test/$(APP)_SUITE.erl
+
+ $i "Run Common Test against this specific test suite with code coverage enabled"
+ $t $(MAKE) -C $(APP) ct-$(APP) COVER=1 $v
+
+ $i "Check that the generated files exist"
+ $t test -f $(APP)/cover/ct.coverdata
+ $t test -f $(APP)/test/ct.cover.spec
+
+ $i "Check that the generated files are removed on clean"
+ $t $(MAKE) -C $(APP) clean $v
+ $t test ! -e $(APP)/cover/ct.coverdata
+ $t test ! -e $(APP)/test/ct.cover.spec
+
cover-custom-dir: init
$i "Bootstrap a new OTP application named $(APP)"
@@ -258,6 +313,34 @@ cover-eunit-apps-only: init
$i "Check that the generated file exists"
$t test -f $(APP)/apps/my_app/cover/eunit.coverdata
+cover-eunit-excl-mods: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Add supervisor module to the cover exclude module list "
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "COVER_EXCLUDE_MODS = $(APP)_sup \n"}' $(APP)/Makefile
+
+ $i "Generate a module containing EUnit tests"
+ $t printf "%s\n" \
+ "-module($(APP))." \
+ "-ifdef(TEST)." \
+ "-include_lib(\"eunit/include/eunit.hrl\")." \
+ "ok_test() -> application:ensure_all_started($(APP))." \
+ "-endif." > $(APP)/src/$(APP).erl
+
+ $i "Run EUnit with code coverage enabled"
+ $t $(MAKE) -C $(APP) eunit COVER=1 $v
+
+ $i "Build the cover report"
+ $t $(MAKE) -C $(APP) cover-report $v
+
+ $i "Check that app was covered, but supervisor wasn't"
+ $t test -f $(APP)/cover/$(APP)_app.COVER.html
+ $t ! test -e $(APP)/cover/$(APP)_sup.COVER.html
+
cover-eunit-incl-apps: init
$i "Bootstrap a new OTP application named $(APP)"
@@ -354,8 +437,8 @@ cover-eunit-incl-deps: init
$t cp ../erlang.mk $(APP)/
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
- $i "Add Cowboy 1.0.0 to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy_commit = 1.0.0\n"}' $(APP)/Makefile
+ $i "Add Cowboy 2.12.0 to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy_commit = 2.12.0\n"}' $(APP)/Makefile
ifdef LEGACY
$i "Add Cowboy to the applications key in the .app.src file"
diff --git a/test/plugin_ct.mk b/test/plugin_ct.mk
index 6c31f49..a1ecf82 100644
--- a/test/plugin_ct.mk
+++ b/test/plugin_ct.mk
@@ -1,10 +1,10 @@
# Common Test plugin.
-CT_TARGETS = $(call list_targets,ct)
+ct_TARGETS = $(call list_targets,ct)
-.PHONY: ct $(CT_TARGETS)
+.PHONY: ct $(ct_TARGETS)
-ct: $(CT_TARGETS)
+ct: $(ct_TARGETS)
ct-all: init
diff --git a/test/plugin_dialyzer.mk b/test/plugin_dialyzer.mk
index 732f568..e4240d7 100644
--- a/test/plugin_dialyzer.mk
+++ b/test/plugin_dialyzer.mk
@@ -1,14 +1,27 @@
# Dialyzer plugin.
-DIALYZER_TARGETS = $(call list_targets,dialyzer)
+dialyzer_TARGETS = $(call list_targets,dialyzer)
+
+dialyzer_TARGETS_SET_1 = dialyzer-app dialyzer-apps-only dialyzer-apps-with-local-deps
+dialyzer_TARGETS_SET_2 = dialyzer-beam dialyzer-check dialyzer-custom-plt dialyzer-deps
+dialyzer_TARGETS_SET_3 = dialyzer-erlc-opts dialyzer-local-deps dialyzer-opts dialyzer-plt-apps
+dialyzer_TARGETS_SET_4 = dialyzer-plt-ebin-only dialyzer-plt-swallow-warnings dialyzer-pt
+
+ifneq ($(filter-out $(dialyzer_TARGETS_SET_1) $(dialyzer_TARGETS_SET_2) $(dialyzer_TARGETS_SET_3) $(dialyzer_TARGETS_SET_4),$(dialyzer_TARGETS)),)
+$(error Dialyzer target missing from dialyzer_TARGETS_SET_* variables.)
+endif
+
+ifdef SET
+dialyzer_TARGETS := $(dialyzer_TARGETS_SET_$(SET))
+endif
ifneq ($(shell which sem 2>/dev/null),)
DIALYZER_MUTEX = sem --fg --id dialyzer
endif
-.PHONY: dialyzer $(DIALYZER_TARGETS)
+.PHONY: dialyzer $(dialyzer_TARGETS)
-dialyzer: $(DIALYZER_TARGETS)
+dialyzer: $(dialyzer_TARGETS)
dialyzer-app: init
@@ -105,7 +118,7 @@ dialyzer-beam: init
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
$i "Add lager to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lager\n"}' $(APP)/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lager\ndep_lager = git https://github.com/erlang-lager/lager master\n"}' $(APP)/Makefile
$i "Add lager_transform to ERLC_OPTS"
$t echo "ERLC_OPTS += +'{parse_transform, lager_transform}'" >> $(APP)/Makefile
@@ -285,6 +298,10 @@ dialyzer-plt-ebin-only: init
$i "Build the application"
$t $(MAKE) -C $(APP) $v
+# @todo Temporary measure to make CACHE_DEPS=1 tests work again.
+ $i "Patch Cowlib's Erlang.mk"
+ $t cp ../erlang.mk $(APP)/deps/cowlib/
+
$i "Build Cowlib for tests to fetch autopatched dependencies"
$t $(MAKE) -C $(APP)/deps/cowlib test-build $v
@@ -308,7 +325,7 @@ dialyzer-plt-swallow-warnings: init
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
$i "Add LFE version referring to a missing function to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lfe\ndep_lfe_commit = d656987dc5f5e08306531ad1ce13bf9ca9ec9e5a\n"}' $(APP)/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = lfe\ndep_lfe = git https://github.com/rvirding/lfe d656987dc5f5e08306531ad1ce13bf9ca9ec9e5a\n"}' $(APP)/Makefile
$i "Create the PLT file"
$t $(DIALYZER_MUTEX) $(MAKE) -C $(APP) plt $v
diff --git a/test/plugin_edoc.mk b/test/plugin_edoc.mk
index 1779797..ca2fce7 100644
--- a/test/plugin_edoc.mk
+++ b/test/plugin_edoc.mk
@@ -1,10 +1,10 @@
# EDoc plugin.
-EDOC_TARGETS = $(call list_targets,edoc)
+edoc_TARGETS = $(call list_targets,edoc)
-.PHONY: edoc $(EDOC_TARGETS)
+.PHONY: edoc $(edoc_TARGETS)
-edoc: $(EDOC_TARGETS)
+edoc: $(edoc_TARGETS)
edoc-build: init
@@ -100,7 +100,7 @@ edoc-opts: init
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
$i "Add edown doclet for EDoc"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DOC_DEPS = edown\nEDOC_OPTS = {doclet, edown_doclet}\n"}' $(APP)/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DOC_DEPS = edown\ndep_edown = git https://github.com/uwiger/edown master\nEDOC_OPTS = {doclet, edown_doclet}\n"}' $(APP)/Makefile
$i "Run EDoc"
$t $(MAKE) -C $(APP) edoc $v
@@ -132,3 +132,66 @@ edoc-src-dirs: init
$t test -f $(APP)/doc/$(APP)_sup.html
$t test -f $(APP)/doc/my_app_app.html
$t test -f $(APP)/doc/my_app_sup.html
+
+edoc-src-subdirs: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Add current directory to the list of EDoc source directories"
+ $t echo 'EDOC_SRC_DIRS = $$(CURDIR)' >> $(APP)/Makefile
+
+ $i "Generate a module in a subdirectory with EDoc comments"
+ $t mkdir $(APP)/src/subdir/
+ $t printf "%s\n" \
+ "%% @doc erlang-mk-edoc-subdir-module" \
+ "-module($(APP))." \
+ "-export([ok/0])." \
+ "" \
+ "%% @doc erlang-mk-edoc-subdir-function" \
+ "ok() -> ok." > $(APP)/src/subdir/$(APP).erl
+
+ $i "Run EDoc"
+ $t $(MAKE) -C $(APP) edoc $v
+
+ $i "Check that the new module's documentation was generated"
+ $t test -f $(APP)/doc/$(APP).html
+
+ $i "Check that the EDoc comments are in the generated documentation"
+ $t grep -q erlang-mk-edoc-subdir-module $(APP)/doc/$(APP).html
+ $t grep -q erlang-mk-edoc-subdir-function $(APP)/doc/$(APP).html
+
+edoc-src-multiapp-subdirs: init
+
+ $i "Bootstrap a multi application repository with a root application"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Create a new application my_app"
+ $t $(MAKE) -C $(APP) new-app in=my_app $v
+
+ $i "Add apps directories to the list of EDoc source directories"
+ $t echo 'EDOC_SRC_DIRS = $$(ALL_APPS_DIRS)' >> $(APP)/Makefile
+
+ $i "Generate a module in a subdirectory with EDoc comments"
+ $t mkdir $(APP)/apps/my_app/src/subdir/
+ $t printf "%s\n" \
+ "%% @doc erlang-mk-edoc-subdir-module" \
+ "-module($(APP))." \
+ "-export([ok/0])." \
+ "" \
+ "%% @doc erlang-mk-edoc-subdir-function" \
+ "ok() -> ok." > $(APP)/apps/my_app/src/subdir/$(APP).erl
+
+ $i "Run EDoc"
+ $t $(MAKE) -C $(APP) edoc $v
+
+ $i "Check that the new module's documentation was generated"
+ $t test -f $(APP)/doc/$(APP).html
+
+ $i "Check that the EDoc comments are in the generated documentation"
+ $t grep -q erlang-mk-edoc-subdir-module $(APP)/doc/$(APP).html
+ $t grep -q erlang-mk-edoc-subdir-function $(APP)/doc/$(APP).html
diff --git a/test/plugin_erlydtl.mk b/test/plugin_erlydtl.mk
index 1dac6e1..0cc0774 100644
--- a/test/plugin_erlydtl.mk
+++ b/test/plugin_erlydtl.mk
@@ -1,10 +1,10 @@
# ErlyDTL plugin.
-ERLYDTL_TARGETS = $(call list_targets,erlydtl)
+erlydtl_TARGETS = $(call list_targets,erlydtl)
-.PHONY: erlydtl $(ERLYDTL_TARGETS)
+.PHONY: erlydtl $(erlydtl_TARGETS)
-erlydtl: $(ERLYDTL_TARGETS)
+erlydtl: $(erlydtl_TARGETS)
erlydtl-compile: init
diff --git a/test/plugin_escript.mk b/test/plugin_escript.mk
index 3949547..d2dd1e6 100644
--- a/test/plugin_escript.mk
+++ b/test/plugin_escript.mk
@@ -1,10 +1,10 @@
# Escript plugin.
-ESCRIPT_TARGETS = $(call list_targets,escript)
+escript_TARGETS = $(call list_targets,escript)
-.PHONY: escript $(ESCRIPT_TARGETS)
+.PHONY: escript $(escript_TARGETS)
-escript: $(ESCRIPT_TARGETS)
+escript: $(escript_TARGETS)
escript-build: init
@@ -97,8 +97,8 @@ escript-deps-with-deps: init
$t cp ../erlang.mk $(APP)/
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
- $i "Add Cowboy 1.0.0 to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy_commit = 1.0.0\n"}' $(APP)/Makefile
+ $i "Add Cowboy 2.12.0 to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowboy\ndep_cowboy_commit = 2.12.0\n"}' $(APP)/Makefile
$i "Generate a module containing a function main/1"
$t printf "%s\n" \
@@ -175,3 +175,40 @@ escript-extra: init
$i "Check that the escript contains the extra files"
$t unzip -l $(APP)/$(APP) 2> /dev/null | grep -q Makefile
$t unzip -l $(APP)/$(APP) 2> /dev/null | grep -q erlang.mk
+
+escript-zip-file: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Set ESCRIPT_ZIP_FILE to a custom location"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "ESCRIPT_ZIP_FILE = tmp/my_escript.zip\n"}' $(APP)/Makefile
+
+ $i "Generate a module containing a function main/1"
+ $t printf "%s\n" \
+ "-module($(APP))." \
+ "-export([main/1])." \
+ 'main(_) -> io:format("good~n").' > $(APP)/src/$(APP).erl
+
+ $i "Build the escript"
+ $t $(MAKE) -C $(APP) escript $v
+
+ $i "Check that the file at ESCRIPT_ZIP_FILE exists"
+ $t test -f $(APP)/tmp/my_escript.zip
+
+ $i "Check that the escript exists"
+ $t test -f $(APP)/$(APP)
+
+ $i "Check that the escript runs"
+ $t $(APP)/$(APP) | grep -q good
+
+ $i "Distclean the application"
+ $t $(MAKE) -C $(APP) distclean $v
+
+ $i "Check that the file at ESCRIPT_ZIP_FILE was removed"
+ $t test ! -e $(APP)/tmp/my_escript.zip
+
+ $i "Check that the escript was removed"
+ $t test ! -e $(APP)/$(APP)
diff --git a/test/plugin_eunit.mk b/test/plugin_eunit.mk
index 768358c..bd1f0e0 100644
--- a/test/plugin_eunit.mk
+++ b/test/plugin_eunit.mk
@@ -1,10 +1,10 @@
# EUnit plugin.
-EUNIT_TARGETS = $(call list_targets,eunit)
+eunit_TARGETS = $(call list_targets,eunit)
-.PHONY: eunit $(EUNIT_TARGETS)
+.PHONY: eunit $(eunit_TARGETS)
-eunit: $(EUNIT_TARGETS)
+eunit: $(eunit_TARGETS)
eunit-all: init
@@ -235,6 +235,27 @@ eunit-check: init
$i "Check that EUnit runs on 'make check'"
$t $(MAKE) -C $(APP) check | grep -c "Test passed." | grep -q 1
+eunit-disable: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Set EUNIT = disable in the Makefile"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "EUNIT = disable\n"}' $(APP)/Makefile
+
+ $i "Generate a module containing EUnit tests"
+ $t printf "%s\n" \
+ "-module($(APP))." \
+ "-ifdef(TEST)." \
+ "-include_lib(\"eunit/include/eunit.hrl\")." \
+ "ok_test() -> ok." \
+ "-endif." > $(APP)/src/$(APP).erl
+
+ $i "Check that EUnit is not run on 'make tests'"
+ $t $(MAKE) -C $(APP) tests | grep -c "Test passed." | grep -q 0
+
eunit-erl-opts: init
$i "Bootstrap a new OTP application named $(APP)"
@@ -347,6 +368,27 @@ eunit-test-dir: init
$i "Check that tests were both run only once"
$t printf "%s\n" $(APP) $(APP)_tests | cmp $(APP)/eunit.log -
+eunit-test-spec: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Configure EUNIT_TEST_SPEC to run a setup function"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "EUNIT_TEST_SPEC = {setup, fun() -> erlang:display(\"EUNIT_TEST_SPEC\" \"-setup\") end, \$$1} \n"}' $(APP)/Makefile
+
+ $i "Generate a module containing EUnit tests"
+ $t printf "%s\n" \
+ "-module($(APP))." \
+ "-ifdef(TEST)." \
+ "-include_lib(\"eunit/include/eunit.hrl\")." \
+ "ok_test() -> ok." \
+ "-endif." > $(APP)/src/$(APP).erl
+
+ $i "Check that EUnit runs the setup function"
+ $t $(MAKE) -C $(APP) eunit | grep -c "EUNIT_TEST_SPEC-setup" | grep -q 1
+
eunit-tests: init
$i "Bootstrap a new OTP application named $(APP)"
diff --git a/test/plugin_hex.mk b/test/plugin_hex.mk
index 66bf6fc..27060b6 100644
--- a/test/plugin_hex.mk
+++ b/test/plugin_hex.mk
@@ -4,11 +4,11 @@
# be started and available on port 4000, and the HEX=1 variable
# must be set.
-HEX_TARGETS = $(call list_targets,hex)
+hex_TARGETS = $(call list_targets,hex)
-.PHONY: hex $(HEX_TARGETS)
+.PHONY: hex $(hex_TARGETS)
-hex: $(HEX_TARGETS)
+hex: $(hex_TARGETS)
ifeq ($(shell netcat -z localhost 4000 && echo ok),ok)
hex-user-create: init
@@ -140,7 +140,7 @@ hex-tarball-create-with-deps: init
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
$i "Add Cowlib to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\ndep_cowlib_commit = 2.10.1\n"}' $(APP)/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\ndep_cowlib_commit = 2.13.0\n"}' $(APP)/Makefile
ifdef LEGACY
$i "Add Cowlib to the applications key in the .app.src file"
@@ -159,7 +159,37 @@ endif
{_, [{<<\"cowlib\">>, Cowlib}]} = lists:keyfind(<<\"requirements\">>, 1, Metadata), \
{_, <<\"cowlib\">>} = lists:keyfind(<<\"app\">>, 1, Cowlib), \
{_, false} = lists:keyfind(<<\"optional\">>, 1, Cowlib), \
- {_, <<\"2.10.1\">>} = lists:keyfind(<<\"requirement\">>, 1, Cowlib), \
+ {_, <<\"2.13.0\">>} = lists:keyfind(<<\"requirement\">>, 1, Cowlib), \
+ halt(0)"
+
+hex-tarball-create-with-req: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Add Cowlib to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\ndep_cowlib_commit = 2.13.0\nhex_req_cowlib = ~> 2.13\n"}' $(APP)/Makefile
+
+ifdef LEGACY
+ $i "Add Cowlib to the applications key in the .app.src file"
+ $t perl -ni.bak -e 'print;if ($$.==7) {print "\t\tcowlib,\n"}' $(APP)/src/$(APP).app.src
+endif
+
+ $i "Create a release tarball"
+ $t $(MAKE) -C $(APP) hex-tarball-create $v
+
+ $i "Confirm the tarball contents can be extracted"
+ $t cd $(APP)/.erlang.mk/ && tar xf $(APP).tar
+
+ $i "Confirm the tarball contains a metadata.config file that lists Cowlib as requirement"
+ $t $(ERL) -eval " \
+ {ok, Metadata} = file:consult(\"$(APP)/.erlang.mk/metadata.config\"), \
+ {_, [{<<\"cowlib\">>, Cowlib}]} = lists:keyfind(<<\"requirements\">>, 1, Metadata), \
+ {_, <<\"cowlib\">>} = lists:keyfind(<<\"app\">>, 1, Cowlib), \
+ {_, false} = lists:keyfind(<<\"optional\">>, 1, Cowlib), \
+ {_, <<\"~> 2.13\">>} = lists:keyfind(<<\"requirement\">>, 1, Cowlib), \
halt(0)"
hex-release-publish: init
@@ -187,6 +217,8 @@ hex-release-publish: init
$i "Check that the release exists"
$t curl -sf http://localhost:4000/api/packages/$(APP)/releases/0.1.0 >/dev/null
+# @todo There's a weird ci.erlang.mk related bug with CACHE_DEPS. Fix it.
+ifndef CACHE_DEPS
hex-release-publish-with-deps: init
$i "Bootstrap a new OTP application named $(APP)"
@@ -195,7 +227,7 @@ hex-release-publish-with-deps: init
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
$i "Add Cowlib to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\ndep_cowlib_commit = 2.10.1\n"}' $(APP)/Makefile
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\ndep_cowlib_commit = 2.13.0\n"}' $(APP)/Makefile
ifdef LEGACY
$i "Add Cowlib to the applications key in the .app.src file"
@@ -221,13 +253,15 @@ endif
$t $(MAKE) -C $(APP) hex-key-add HEX_USERNAME=$(APP) HEX_PASSWORD="1234567" | grep ^Secret: | cut -f2 -d" " > $(APP)/hex.key
$i "Publish the Cowlib release"
- $t $(MAKE) -C $(APP)/deps/cowlib hex-release-publish HEX_SECRET=`cat $(APP)/hex.key` $v
+ $t cp ../erlang.mk $(APP)/deps/cowlib
+ $t $(MAKE) -C $(APP)/deps/cowlib hex-release-publish DEPS_DIR=$(APP)/deps ERLANG_MK_TMP=$(APP)/.erlang.mk HEX_SECRET=`cat $(APP)/hex.key` $v
$i "Publish the release"
$t $(MAKE) -C $(APP) hex-release-publish HEX_SECRET=`cat $(APP)/hex.key` $v
$i "Check that the release exists and includes Cowlib as requirement"
$t curl -sf http://localhost:4000/api/packages/$(APP)/releases/0.1.0 | grep -q cowlib
+endif
hex-release-replace: init
diff --git a/test/plugin_proper.mk b/test/plugin_proper.mk
index 108b6e4..42a324d 100644
--- a/test/plugin_proper.mk
+++ b/test/plugin_proper.mk
@@ -1,10 +1,10 @@
# PropEr plugin.
-PROPER_TARGETS = $(call list_targets,proper)
+proper_TARGETS = $(call list_targets,proper)
-.PHONY: proper $(PROPER_TARGETS)
+.PHONY: proper $(proper_TARGETS)
-proper: $(PROPER_TARGETS)
+proper: $(proper_TARGETS)
proper-test-dir: init
diff --git a/test/plugin_protobuffs.mk b/test/plugin_protobuffs.mk
index f5814e8..2daadf1 100644
--- a/test/plugin_protobuffs.mk
+++ b/test/plugin_protobuffs.mk
@@ -1,10 +1,10 @@
# Protocol buffers plugin.
-PROTOBUFFS_TARGETS = $(call list_targets,protobuffs)
+protobuffs_TARGETS = $(call list_targets,protobuffs)
-.PHONY: protobuffs $(PROTOBUFFS_TARGETS)
+.PHONY: protobuffs $(protobuffs_TARGETS)
-protobuffs: $(PROTOBUFFS_TARGETS)
+protobuffs: $(protobuffs_TARGETS)
PROTOBUFFS_URL = https://raw.githubusercontent.com/basho/erlang_protobuffs/master/test/erlang_protobuffs_SUITE_data
@@ -15,8 +15,8 @@ protobuffs-compile: init
$t cp ../erlang.mk $(APP)/
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
- $i "Add protobuffs to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "BUILD_DEPS = protobuffs\n"}' $(APP)/Makefile
+ $i "Add gpb to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "BUILD_DEPS = gpb\n"}' $(APP)/Makefile
$i "Download two proto files"
$t mkdir $(APP)/src/proto/
@@ -40,7 +40,7 @@ protobuffs-compile: init
{ok, [empty_pb, simple_pb]} = application:get_key($(APP), modules), \
halt()"
-protobuffs-compile-with-gpb: init
+protobuffs-compile-imports: init
$i "Bootstrap a new OTP library named $(APP)"
$t mkdir $(APP)/
@@ -50,26 +50,26 @@ protobuffs-compile-with-gpb: init
$i "Add gpb to the list of dependencies"
$t perl -ni.bak -e 'print;if ($$.==1) {print "BUILD_DEPS = gpb\n"}' $(APP)/Makefile
- $i "Download two proto files"
+ $i "Download two proto files with an import"
$t mkdir $(APP)/src/proto/
- $t curl -s -o $(APP)/src/proto/empty.proto $(PROTOBUFFS_URL)/proto/empty.proto
- $t curl -s -o $(APP)/src/proto/simple.proto $(PROTOBUFFS_URL)/proto/simple.proto
+ $t curl -s -o $(APP)/src/proto/exports.proto $(PROTOBUFFS_URL)/proto/exports.proto
+ $t curl -s -o $(APP)/src/proto/imports.proto $(PROTOBUFFS_URL)/proto/imports.proto
$i "Build the application"
$t $(MAKE) -C $(APP) $v
$i "Check that an Erlang module was generated and compiled"
- $t test -f $(APP)/src/empty_pb.erl
- $t test -f $(APP)/src/simple_pb.erl
- $t test -f $(APP)/include/empty_pb.hrl
- $t test -f $(APP)/include/simple_pb.hrl
- $t test -f $(APP)/ebin/empty_pb.beam
- $t test -f $(APP)/ebin/simple_pb.beam
+ $t test -f $(APP)/src/exports_pb.erl
+ $t test -f $(APP)/src/imports_pb.erl
+ $t test -f $(APP)/include/exports_pb.hrl
+ $t test -f $(APP)/include/imports_pb.hrl
+ $t test -f $(APP)/ebin/exports_pb.beam
+ $t test -f $(APP)/ebin/imports_pb.beam
$i "Check that the generated modules are included in .app file"
$t $(ERL) -pa $(APP)/ebin/ -eval " \
ok = application:load($(APP)), \
- {ok, [empty_pb, simple_pb]} = application:get_key($(APP), modules), \
+ {ok, [exports_pb, imports_pb]} = application:get_key($(APP), modules), \
halt()"
protobuffs-dont-compile: init
@@ -110,8 +110,8 @@ protobuffs-makefile-change: init
$t cp ../erlang.mk $(APP)/
$t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
- $i "Add protobuffs to the list of dependencies"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "BUILD_DEPS = protobuffs\n"}' $(APP)/Makefile
+ $i "Add gpb to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "BUILD_DEPS = gpb\n"}' $(APP)/Makefile
$i "Download two proto files"
$t mkdir $(APP)/src/proto/
diff --git a/test/plugin_relx.mk b/test/plugin_relx.mk
index 2771e8f..c91a26b 100644
--- a/test/plugin_relx.mk
+++ b/test/plugin_relx.mk
@@ -3,9 +3,9 @@
# Sleeps when interacting with relx script are necessary after start and upgrade
# as both of those interactions are not synchronized.
-RELX_TARGETS = $(call list_targets,relx)
+relx_TARGETS = $(call list_targets,relx)
-.PHONY: relx $(RELX_TARGETS)
+.PHONY: relx $(relx_TARGETS)
ifeq ($(PLATFORM),msys2)
RELX_REL_EXT = .cmd
@@ -13,7 +13,7 @@ else
RELX_REL_EXT =
endif
-relx: $(RELX_TARGETS)
+relx: $(relx_TARGETS)
relx-rel: init
@@ -25,9 +25,6 @@ relx-rel: init
$i "Build the release"
$t $(MAKE) -C $(APP) $v
- $i "Check that relx was downloaded"
- $t test -f $(APP)/.erlang.mk/relx
-
$i "Check that the release was built"
$t test -d $(APP)/_rel
$t test -d $(APP)/_rel/$(APP)_release
@@ -66,8 +63,8 @@ relx-apps-with-deps: init
$i "Include my_app in the release"
$t perl -pi.bak -e 's/$(APP),/$(APP), my_app,/' $(APP)/relx.config
- $i "Add Cowlib to the list of dependencies for my_app"
- $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\n"}' $(APP)/apps/my_app/Makefile
+ $i "Add Cowlib 2.13.0 to the list of dependencies for my_app"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = cowlib\ndep_cowlib_commit = 2.13.0\n"}' $(APP)/apps/my_app/Makefile
ifdef LEGACY
$i "Add Cowlib to the applications key in the my_app.app.src file"
@@ -85,7 +82,7 @@ endif
$t test -f $(APP)/deps/cowlib/ebin/cowlib.app
$i "Check that Cowlib was included in the release"
- $t test -d $(APP)/_rel/test_relx_apps_with_deps_release/lib/cowlib-1.0.2
+ $t test -d $(APP)/_rel/test_relx_apps_with_deps_release/lib/cowlib-2.13.0
relx-bare-rel: init
@@ -97,9 +94,6 @@ relx-bare-rel: init
$i "Build the release"
$t $(MAKE) -C $(APP) rel $v
- $i "Check that relx was downloaded"
- $t test -f $(APP)/.erlang.mk/relx
-
$i "Check that the release was built"
$t test -d $(APP)/_rel
$t test -d $(APP)/_rel/$(APP)_release
@@ -108,6 +102,23 @@ relx-bare-rel: init
$t test -d $(APP)/_rel/$(APP)_release/releases
$t test -d $(APP)/_rel/$(APP)_release/releases/1
+relx-output-dir: init
+
+ $i "Bootstrap a new release named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap bootstrap-rel $v
+
+ $i "Set RELX_OUTPUT_DIR to _rel2"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "RELX_OUTPUT_DIR = _rel2\n"}' $(APP)/Makefile
+
+ $i "Build the release"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that the release exists in the correct location"
+ $t ! test -d $(APP)/_rel
+ $t test -d $(APP)/_rel2
+
relx-post-rel: init
$i "Bootstrap a new release named $(APP)"
@@ -122,9 +133,6 @@ relx-post-rel: init
$i "Build the release"
$t $(MAKE) -C $(APP) $v
- $i "Check that relx was downloaded"
- $t test -f $(APP)/.erlang.mk/relx
-
$i "Check that the release was built"
$t test -d $(APP)/_rel
$t test -d $(APP)/_rel/$(APP)_release
@@ -154,6 +162,99 @@ relx-post-rel: init
$i "Check that the output directory was removed entirely"
$t test ! -d $(APP)/_rel/
+relx-rel-with-script: init
+
+ $i "Bootstrap a new release named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap bootstrap-rel $v
+
+ $i "Create a relx.config.script file"
+ $t printf "%s\n" \
+ "{release, {App, _Ver}, Apps} = lists:keyfind(release, 1, CONFIG)," \
+ "lists:keyreplace(release, 1, CONFIG, {release, {App, \"ONE\"}, Apps})." \
+ > $(APP)/relx.config.script
+
+ $i "Build the release"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that the release was built"
+ $t test -d $(APP)/_rel
+ $t test -d $(APP)/_rel/$(APP)_release
+ $t test -d $(APP)/_rel/$(APP)_release/bin
+ $t test -d $(APP)/_rel/$(APP)_release/lib
+ $t test -d $(APP)/_rel/$(APP)_release/releases
+ $t test -d $(APP)/_rel/$(APP)_release/releases/ONE
+
+ $i "Clean the application"
+ $t $(MAKE) -C $(APP) clean $v
+
+ $i "Check that the release still exists"
+ $t test -d $(APP)/_rel
+ $t test -d $(APP)/_rel/$(APP)_release
+ $t test -d $(APP)/_rel/$(APP)_release/bin
+ $t test -d $(APP)/_rel/$(APP)_release/lib
+ $t test -d $(APP)/_rel/$(APP)_release/releases
+ $t test -d $(APP)/_rel/$(APP)_release/releases/ONE
+
+ $i "Distclean the application"
+ $t $(MAKE) -C $(APP) distclean $v
+
+ $i "Check that the output directory was removed entirely"
+ $t test ! -d $(APP)/_rel/
+
+define relx-rel-with-only-script-relx.config.script.erl
+endef
+
+relx-rel-with-script-only: init
+
+ $i "Bootstrap a new release named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap bootstrap-rel $v
+
+ $i "Delete relx.config and create a relx.config.script file"
+ $t rm -f $(APP)/relx.config
+ $t printf "%s\n" \
+ "CONFIG = [], %% Assert that config is empty." \
+ "[" \
+ " {release, {$(APP)_release, \"ONE\"}, [$(APP), sasl, runtime_tools]}," \
+ " {dev_mode, false}," \
+ " {include_erts, true}," \
+ " {extended_start_script, true}," \
+ " {sys_config, \"config/sys.config\"}," \
+ " {vm_args, \"config/vm.args\"}" \
+ "| CONFIG]." \
+ > $(APP)/relx.config.script
+
+ $i "Build the release"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that the release was built"
+ $t test -d $(APP)/_rel
+ $t test -d $(APP)/_rel/$(APP)_release
+ $t test -d $(APP)/_rel/$(APP)_release/bin
+ $t test -d $(APP)/_rel/$(APP)_release/lib
+ $t test -d $(APP)/_rel/$(APP)_release/releases
+ $t test -d $(APP)/_rel/$(APP)_release/releases/ONE
+
+ $i "Clean the application"
+ $t $(MAKE) -C $(APP) clean $v
+
+ $i "Check that the release still exists"
+ $t test -d $(APP)/_rel
+ $t test -d $(APP)/_rel/$(APP)_release
+ $t test -d $(APP)/_rel/$(APP)_release/bin
+ $t test -d $(APP)/_rel/$(APP)_release/lib
+ $t test -d $(APP)/_rel/$(APP)_release/releases
+ $t test -d $(APP)/_rel/$(APP)_release/releases/ONE
+
+ $i "Distclean the application"
+ $t $(MAKE) -C $(APP) distclean $v
+
+ $i "Check that the output directory was removed entirely"
+ $t test ! -d $(APP)/_rel/
+
ifneq ($(PLATFORM),msys2)
# This test is currently disabled on Windows because we are
# running into too many issues preventing the test from
@@ -218,11 +319,11 @@ ifeq ($(PLATFORM),msys2)
else
$i "Start initial release and confirm it runs the old code"
endif
- $t $(APP)/tmp/bin/$(APP)_release$(RELX_REL_EXT) start
+ $t $(APP)/tmp/bin/$(APP)_release$(RELX_REL_EXT) daemon
$t sleep 1
ifneq ($(PLATFORM),msys2)
-# On Windows the script does not have the commands rpcterms and versions.
- $t test `$(APP)/tmp/bin/$(APP)_release$(RELX_REL_EXT) rpcterms test test` = old
+# On Windows the script does not have the commands rpc and versions.
+ $t test `$(APP)/tmp/bin/$(APP)_release$(RELX_REL_EXT) rpc test test` = old
$i "Check that it's 1 available version"
$t test `$(APP)/tmp/bin/$(APP)_release$(RELX_REL_EXT) versions | wc -l` = "2"
@@ -246,8 +347,8 @@ else
endif
$t sleep 1
ifneq ($(PLATFORM),msys2)
-# On Windows the script does not have the commands rpcterms and versions.
- $t test `$(APP)/tmp/bin/$(APP)_release$(RELX_REL_EXT) rpcterms test test` = new
+# On Windows the script does not have the commands rpc and versions.
+ $t test `$(APP)/tmp/bin/$(APP)_release$(RELX_REL_EXT) rpc test test` = new
$i "Check that it's 2 available versions"
$t test `$(APP)/tmp/bin/$(APP)_release$(RELX_REL_EXT) versions | wc -l` = "3"
@@ -266,8 +367,8 @@ else
endif
$t sleep 1
ifneq ($(PLATFORM),msys2)
-# On Windows the script does not have the commands rpcterms and versions.
- $t test `$(APP)/tmp/bin/$(APP)_release$(RELX_REL_EXT) rpcterms test test` = old
+# On Windows the script does not have the commands rpc and versions.
+ $t test `$(APP)/tmp/bin/$(APP)_release$(RELX_REL_EXT) rpc test test` = old
endif
$i "Stop the release"
@@ -300,7 +401,7 @@ endif
ifeq ($(PLATFORM),msys2)
$t $(APP)/_rel/$(APP)_release/bin/$(APP)_release$(RELX_REL_EXT) install
endif
- $t $(APP)/_rel/$(APP)_release/bin/$(APP)_release$(RELX_REL_EXT) start
+ $t $(APP)/_rel/$(APP)_release/bin/$(APP)_release$(RELX_REL_EXT) daemon
$i "Ping the release"
$t $(call wait_for_success,$(APP)/_rel/$(APP)_release/bin/$(APP)_release$(RELX_REL_EXT) ping)
@@ -341,7 +442,7 @@ relx-tar: init
$i "Check that tarball exists"
$t test -f $(APP)/_rel/$(APP)_release/$(APP)_release-1.tar.gz
-relx-vsn: init
+relx-vsn-cmd: init
$i "Bootstrap a new release named $(APP)"
$t mkdir $(APP)/
@@ -357,3 +458,37 @@ relx-vsn: init
$i "Check that the correct release exists"
$t ! test -d $(APP)/_rel/$(APP)_release/releases/1
$t test -d $(APP)/_rel/$(APP)_release/releases/2
+
+relx-vsn-git-long: init
+
+ $i "Bootstrap a new release named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap bootstrap-rel $v
+
+ $i "Replace the vsn"
+ $t sed -i.bak s/"\"1\""/"{git, long}"/ $(APP)/relx.config
+
+ $i "Build the release"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that the correct release exists"
+ $t ! test -d $(APP)/_rel/$(APP)_release/releases/1
+ $t test -d $(APP)/_rel/$(APP)_release/releases/$(shell git rev-parse HEAD)
+
+relx-vsn-git-short: init
+
+ $i "Bootstrap a new release named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap bootstrap-rel $v
+
+ $i "Replace the vsn"
+ $t sed -i.bak s/"\"1\""/"{git, short}"/ $(APP)/relx.config
+
+ $i "Build the release"
+ $t $(MAKE) -C $(APP) $v
+
+ $i "Check that the correct release exists"
+ $t ! test -d $(APP)/_rel/$(APP)_release/releases/1
+ $t test -d $(APP)/_rel/$(APP)_release/releases/$(shell git rev-parse --short HEAD)
diff --git a/test/plugin_shell.mk b/test/plugin_shell.mk
index 533f0a7..83b9883 100644
--- a/test/plugin_shell.mk
+++ b/test/plugin_shell.mk
@@ -1,10 +1,10 @@
# Shell plugin.
-SHELL_TARGETS = $(call list_targets,shell)
+shell_TARGETS = $(call list_targets,shell)
-.PHONY: shell $(C_SRC_TARGETS)
+.PHONY: shell $(shell_TARGETS)
-shell: $(SHELL_TARGETS)
+shell: $(shell_TARGETS)
shell-compile: init
diff --git a/test/plugin_sphinx.mk b/test/plugin_sphinx.mk
index 915bf8b..834a273 100644
--- a/test/plugin_sphinx.mk
+++ b/test/plugin_sphinx.mk
@@ -2,14 +2,14 @@
# Disable this test suite when sphinx is not installed.
ifeq ($(shell which sphinx-build),)
-SPHINX_TARGETS =
+sphinx_TARGETS =
else
-SPHINX_TARGETS = $(call list_targets,sphinx)
+sphinx_TARGETS = $(call list_targets,sphinx)
endif
-.PHONY: sphinx $(SPHINX_TARGETS)
+.PHONY: sphinx $(sphinx_TARGETS)
-sphinx: $(SPHINX_TARGETS)
+sphinx: $(sphinx_TARGETS)
sphinx-build: init
diff --git a/test/plugin_triq.mk b/test/plugin_triq.mk
index 58fd217..bf81d98 100644
--- a/test/plugin_triq.mk
+++ b/test/plugin_triq.mk
@@ -1,10 +1,10 @@
# Triq plugin.
-TRIQ_TARGETS = $(call list_targets,triq)
+triq_TARGETS = $(call list_targets,triq)
-.PHONY: triq $(TRIQ_TARGETS)
+.PHONY: triq $(triq_TARGETS)
-triq: $(TRIQ_TARGETS)
+triq: $(triq_TARGETS)
triq-test-dir: init
diff --git a/test/plugin_xref.mk b/test/plugin_xref.mk
new file mode 100644
index 0000000..e98d7d0
--- /dev/null
+++ b/test/plugin_xref.mk
@@ -0,0 +1,312 @@
+# Xref plugin.
+
+xref_TARGETS = $(call list_targets,xref)
+
+.PHONY: xref $(xref_TARGETS)
+
+xref: $(xref_TARGETS)
+
+xref-check: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Run the Xref plugin"
+ $t $(MAKE) -C $(APP) xref $v
+
+ $i "Create a module with an undefined function call"
+ $t printf "%s\n" \
+ "-module(bad)." \
+ "-export([f/0])." \
+ "f() -> this_module:does_not_exist()." \
+ > $(APP)/src/bad.erl
+
+ $i "Run the Xref plugin again, expect an error"
+ $t ! $(MAKE) -C $(APP) xref $v
+
+xref-check-custom: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Run the Xref plugin with undefined_functions"
+ $t $(MAKE) -C $(APP) xref XREF_CHECKS=undefined_functions $v
+
+ $i "Create a module with an unused export"
+ $t printf "%s\n" \
+ "-module(bad1)." \
+ "-export([f/0])." \
+ "f() -> whereis(user) ! bad_message." \
+ > $(APP)/src/bad1.erl
+
+ $i "Run the Xref plugin with exports_not_used, expect an error"
+ $t ! $(MAKE) -C $(APP) xref XREF_CHECKS=exports_not_used $v
+
+ $i "Run the Xref plugin with multiple checks"
+ $t $(MAKE) -C $(APP) xref XREF_CHECKS="[undefined_function_calls, undefined_functions]" $v
+
+ $i "Create a module with an undefined function call"
+ $t printf "%s\n" \
+ "-module(bad2)." \
+ "-export([f/0])." \
+ "f() -> this_module:does_not_exist()." \
+ > $(APP)/src/bad2.erl
+
+ $i "Run the Xref plugin with multiple checks, expect an error"
+ $t ! $(MAKE) -C $(APP) xref XREF_CHECKS="[undefined_function_calls, undefined_functions]" $v
+
+xref-check-informational: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Run the Xref plugin with module_use"
+ $t $(MAKE) -C $(APP) xref XREF_CHECKS="{module_use, $(APP)_sup}" > $(APP)/output.txt
+
+ $i "Confirm that the module was found"
+ $t grep -q "\- $(APP)_app$$" $(APP)/output.txt
+
+xref-query: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Run the Xref plugin with query XC (external calls)"
+ $t $(MAKE) -C $(APP) xref q="XC" > $(APP)/output.txt
+
+ $i "Confirm that the supervisor:start_link/3 call was found"
+ $t grep -q "\- supervisor:start_link/3 called by $(APP)_sup:start_link/0$$" $(APP)/output.txt
+
+xref-scope-apps: init
+
+ $i "Bootstrap a new OTP library named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v
+
+ $i "Create a new library my_app"
+ $t $(MAKE) -C $(APP) new-lib in=my_app $v
+
+ $i "Create a module with an undefined function call inside my_app"
+ $t printf "%s\n" \
+ "-module(bad2)." \
+ "-export([f/0])." \
+ "f() -> this_module:does_not_exist()." \
+ > $(APP)/apps/my_app/src/bad2.erl
+
+ $i "Run the Xref plugin with apps in the scope, expect an error"
+ $t ! $(MAKE) -C $(APP) xref XREF_SCOPE="app apps" $v
+
+xref-scope-deps: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Bootstrap a new OTP library named my_dep inside $(APP)"
+ $t mkdir $(APP)/my_dep
+ $t cp ../erlang.mk $(APP)/my_dep/
+ $t $(MAKE) -C $(APP)/my_dep/ -f erlang.mk bootstrap-lib $v
+
+ $i "Create a module with an undefined function call inside my_dep"
+ $t printf "%s\n" \
+ "-module(bad2)." \
+ "-export([f/0])." \
+ "f() -> this_module:does_not_exist()." \
+ > $(APP)/my_dep/src/bad2.erl
+
+ $i "Add my_dep to the list of dependencies"
+ $t perl -ni.bak -e 'print;if ($$.==1) {print "DEPS = my_dep\ndep_my_dep = cp $(CURDIR)/$(APP)/my_dep/\n"}' $(APP)/Makefile
+
+ifdef LEGACY
+ $i "Add my_dep to the applications key in the .app.src file"
+ $t perl -ni.bak -e 'print;if ($$.==7) {print "\t\tmy_dep,\n"}' $(APP)/src/$(APP).app.src
+endif
+
+ $i "Run the Xref plugin with deps in the scope, expect an error"
+ $t ! $(MAKE) -C $(APP) xref XREF_SCOPE="app deps" $v
+
+xref-scope-otp: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Run the Xref plugin for module use with OTP in the scope"
+ $t $(MAKE) -C $(APP) xref XREF_CHECKS="{module_use, asn1ct_pretty_format}" \
+ XREF_SCOPE="app otp" > $(APP)/output.txt
+
+ $i "Confirm that the asn1ct_pretty_format module use was analysed"
+ $t grep -q "\- asn1ct_pretty_format$$" $(APP)/output.txt
+
+xref-extra-apps: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Bootstrap a new OTP library named extra_app inside $(APP)"
+ $t mkdir $(APP)/extra_app
+ $t cp ../erlang.mk $(APP)/extra_app/
+ $t $(MAKE) -C $(APP)/extra_app/ -f erlang.mk bootstrap-lib $v
+
+ $i "Create a module in extra_app with a function call to $(APP)"
+ $t printf "%s\n" \
+ "-module(extra)." \
+ "-export([f/0])." \
+ "f() -> $(APP)_sup:init([])." \
+ > $(APP)/extra_app/src/extra.erl
+
+ $i "Build extra_app"
+ $t $(MAKE) -C $(APP)/extra_app $v
+
+ $i "Run the Xref plugin for application use with the extra app"
+ $t $(MAKE) -C $(APP) xref XREF_CHECKS="{application_use, $(APP)}" \
+ XREF_EXTRA_APP_DIRS="extra_app/" > $(APP)/output.txt
+
+ $i "Confirm that the extra_app application call was found"
+ $t grep -q "\- extra_app$$" $(APP)/output.txt
+
+xref-extra-dirs: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Bootstrap a new OTP library named extra_dir inside $(APP)"
+ $t mkdir $(APP)/extra_dir
+ $t cp ../erlang.mk $(APP)/extra_dir/
+ $t $(MAKE) -C $(APP)/extra_dir/ -f erlang.mk bootstrap-lib $v
+
+ $i "Create a module in extra_dir with an undefined function call"
+ $t printf "%s\n" \
+ "-module(bad)." \
+ "-export([f/0])." \
+ "f() -> this_module:does_not_exist()." \
+ > $(APP)/extra_dir/src/bad.erl
+
+ $i "Build extra_dir"
+ $t $(MAKE) -C $(APP)/extra_dir $v
+
+ $i "Run the Xref plugin with the extra dir, expect an error"
+ $t ! $(MAKE) -C $(APP) xref XREF_EXTRA_DIRS="extra_dir/ebin/" $v
+
+xref-ignore-inline-fa: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Create a module with an undefined function call and an inline ignore"
+ $t printf "%s\n" \
+ "-module(bad)." \
+ "-export([f/0])." \
+ "-ignore_xref([{f,0}])." \
+ "f() -> f_module:f_not_exist()." \
+ > $(APP)/src/bad.erl
+
+ $i "Run the Xref plugin, expect success"
+ $t $(MAKE) -C $(APP) xref $v
+
+xref-ignore-inline-mfa: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Create a module with undefined function calls and inline ignores"
+ $t printf "%s\n" \
+ "-module(bad)." \
+ "-export([f/0, g/0])." \
+ "-ignore_xref([{bad,f,0}])." \
+ "-ignore_xref({g_module,g_not_exist,0})." \
+ "f() -> f_module:f_not_exist()." \
+ "g() -> g_module:g_not_exist()." \
+ > $(APP)/src/bad.erl
+
+ $i "Run the Xref plugin, expect success"
+ $t $(MAKE) -C $(APP) xref $v
+
+xref-ignore-inline-mod: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Create a module with undefined function calls and inline ignores"
+ $t printf "%s\n" \
+ "-module(bad)." \
+ "-export([f/0, g/0])." \
+ "-ignore_xref([?MODULE])." \
+ "-ignore_xref(g_module)." \
+ "f() -> f_module:f_not_exist()." \
+ "g() -> g_module:g_not_exist()." \
+ > $(APP)/src/bad.erl
+
+ $i "Run the Xref plugin, expect success"
+ $t $(MAKE) -C $(APP) xref $v
+
+xref-ignore-project-wide-mfa: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Create a module with an undefined function call"
+ $t printf "%s\n" \
+ "-module(bad)." \
+ "-export([f/0])." \
+ "f() -> this_module:does_not_exist()." \
+ > $(APP)/src/bad.erl
+
+ $i "Run the Xref plugin with project-wide ignore, expect success"
+ $t $(MAKE) -C $(APP) xref XREF_IGNORE="{bad,f,0}" $v
+
+xref-ignore-project-wide-mod: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Create a module with an undefined function call"
+ $t printf "%s\n" \
+ "-module(bad)." \
+ "-export([f/0])." \
+ "f() -> this_module:does_not_exist()." \
+ > $(APP)/src/bad.erl
+
+ $i "Run the Xref plugin with project-wide ignore, expect success"
+ $t $(MAKE) -C $(APP) xref XREF_IGNORE="[bad]" $v
+
+xref-ignore-callbacks: init
+
+ $i "Bootstrap a new OTP application named $(APP)"
+ $t mkdir $(APP)/
+ $t cp ../erlang.mk $(APP)/
+ $t $(MAKE) -C $(APP) -f erlang.mk bootstrap $v
+
+ $i "Run the Xref plugin for exports_not_used, expect success"
+ $t $(MAKE) -C $(APP) xref XREF_CHECKS="exports_not_used" $v
+
+ $i "Run the Xref plugin again with explicit ignoring of callbacks, expect success"
+ $t $(MAKE) -C $(APP) xref XREF_CHECKS="exports_not_used" XREF_IGNORE_CALLBACKS=1 $v
+
+ $i "Run the Xref plugin again without ignoring callbacks, expect an error"
+ $t ! $(MAKE) -C $(APP) xref XREF_CHECKS="exports_not_used" XREF_IGNORE_CALLBACKS=0 $v