165 lines
5.5 KiB
Makefile
165 lines
5.5 KiB
Makefile
REBAR := "$(shell echo `pwd`/rebar)"
|
|
ELIXIRC := bin/elixirc --ignore-module-conflict $(ELIXIRC_OPTS)
|
|
ERLC := erlc -I lib/elixir/include
|
|
ERL := erl -I lib/elixir/include -noshell -pa lib/elixir/ebin
|
|
VERSION := $(strip $(shell cat VERSION))
|
|
Q := @
|
|
PREFIX := /usr/local
|
|
LIBDIR := lib
|
|
INSTALL = install
|
|
INSTALL_DIR = $(INSTALL) -m755 -d
|
|
INSTALL_DATA = $(INSTALL) -m644
|
|
INSTALL_PROGRAM = $(INSTALL) -m755
|
|
|
|
|
|
.PHONY: install compile erlang elixir dialyze test clean docs release_docs release_zip release_erl
|
|
.NOTPARALLEL: compile
|
|
|
|
#==> Templates
|
|
|
|
define APP_TEMPLATE
|
|
$(1): lib/$(1)/ebin/Elixir.$(2).beam lib/$(1)/ebin/$(1).app
|
|
|
|
lib/$(1)/ebin/$(1).app:
|
|
$(Q) cd lib/$(1) && ../../bin/elixir -e "Mix.Server.start_link(:dev)" -r mix.exs -e "Mix.Task.run('compile.app')"
|
|
|
|
lib/$(1)/ebin/Elixir.$(2).beam: $(wildcard lib/$(1)/lib/*.ex) $(wildcard lib/$(1)/lib/*/*.ex) $(wildcard lib/$(1)/lib/*/*/*.ex)
|
|
@ echo "==> $(1) (compile)"
|
|
$(Q) $$(ELIXIRC) "lib/$(1)/lib/**/*.ex" -o lib/$(1)/ebin
|
|
|
|
test_$(1): $(1)
|
|
@ echo "==> $(1) (exunit)"
|
|
$(Q) cd lib/$(1) && ../../bin/elixir -r "test/test_helper.exs" -pr "test/**/*_test.exs";
|
|
endef
|
|
|
|
#==> Compilation tasks
|
|
|
|
KERNEL:=lib/elixir/ebin/Elixir.Kernel.beam
|
|
UNICODE:=lib/elixir/ebin/Elixir.String.Unicode.beam
|
|
|
|
default: compile
|
|
|
|
compile: lib/elixir/src/elixir.app.src erlang elixir
|
|
|
|
lib/elixir/src/elixir.app.src: src/elixir.app.src
|
|
$(Q) rm -rf lib/elixir/src/elixir.app.src
|
|
$(Q) cp src/elixir.app.src lib/elixir/src/elixir.app.src
|
|
|
|
erlang:
|
|
$(Q) cd lib/elixir && $(REBAR) compile
|
|
|
|
# Since Mix depends on EEx and EEx depends on
|
|
# Mix, we first compile EEx without the .app
|
|
# file, then mix and then compile eex fully
|
|
elixir: kernel lib/eex/ebin/Elixir.EEx.beam mix ex_unit eex iex
|
|
|
|
kernel: $(KERNEL) VERSION
|
|
$(KERNEL): lib/elixir/lib/*.ex lib/elixir/lib/*/*.ex
|
|
$(Q) if [ ! -f $(KERNEL) ]; then \
|
|
echo "==> bootstrap (compile)"; \
|
|
$(ERL) -s elixir_compiler core -s erlang halt; \
|
|
fi
|
|
@ echo "==> kernel (compile)";
|
|
$(Q) $(ELIXIRC) "lib/elixir/lib/**/*.ex" -o lib/elixir/ebin;
|
|
$(Q) $(MAKE) unicode
|
|
$(Q) rm -rf lib/elixir/ebin/elixir.app
|
|
$(Q) cd lib/elixir && $(REBAR) compile
|
|
|
|
unicode: $(UNICODE)
|
|
$(UNICODE): lib/elixir/priv/unicode.ex lib/elixir/priv/UnicodeData.txt lib/elixir/priv/NamedSequences.txt
|
|
@ echo "==> unicode (compile)";
|
|
@ echo "This step can take up to a minute to compile in order to embed the Unicode database"
|
|
$(Q) $(ELIXIRC) lib/elixir/priv/unicode.ex -o lib/elixir/ebin;
|
|
|
|
$(eval $(call APP_TEMPLATE,ex_unit,ExUnit))
|
|
$(eval $(call APP_TEMPLATE,eex,EEx))
|
|
$(eval $(call APP_TEMPLATE,mix,Mix))
|
|
$(eval $(call APP_TEMPLATE,iex,IEx))
|
|
|
|
install: compile
|
|
@ echo "==> elixir (install)"
|
|
for dir in lib/*; do \
|
|
$(INSTALL_DIR) "$(DESTDIR)$(PREFIX)/$(LIBDIR)/elixir/$$dir/ebin"; \
|
|
$(INSTALL_DATA) $$dir/ebin/* "$(DESTDIR)$(PREFIX)/$(LIBDIR)/elixir/$$dir/ebin"; \
|
|
done
|
|
$(INSTALL_DIR) "$(DESTDIR)$(PREFIX)/$(LIBDIR)/elixir/bin"
|
|
$(INSTALL_PROGRAM) $(filter-out %.bat, $(wildcard bin/*)) "$(DESTDIR)$(PREFIX)/$(LIBDIR)/elixir/bin"
|
|
$(INSTALL_DIR) "$(DESTDIR)$(PREFIX)/bin"
|
|
for file in "$(DESTDIR)$(PREFIX)"/$(LIBDIR)/elixir/bin/* ; do \
|
|
ln -sf "../$(LIBDIR)/elixir/bin/$${file##*/}" "$(DESTDIR)$(PREFIX)/bin/" ; \
|
|
done
|
|
|
|
clean:
|
|
cd lib/elixir && $(REBAR) clean
|
|
rm -rf ebin
|
|
rm -rf lib/*/ebin
|
|
rm -rf lib/*/tmp
|
|
rm -rf lib/mix/test/fixtures/git_repo
|
|
rm -rf lib/mix/test/fixtures/deps_on_git_repo
|
|
rm -rf lib/mix/test/fixtures/git_rebar
|
|
rm -rf lib/elixir/src/elixir.app.src
|
|
|
|
clean_exbeam:
|
|
$(Q) rm -f lib/*/ebin/Elixir.*.beam
|
|
|
|
#==> Release tasks
|
|
|
|
SOURCE_REF = $(shell head="$$(git rev-parse HEAD)" tag="$$(git tag --points-at $$head | tail -1)" ; echo "$${tag:-$$head}\c")
|
|
|
|
docs: compile ../ex_doc/bin/ex_doc
|
|
mkdir -p ebin
|
|
rm -rf docs
|
|
cp -R -f lib/*/ebin/*.beam ./ebin
|
|
bin/elixir ../ex_doc/bin/ex_doc "Elixir" "$(VERSION)" -m Kernel -u "https://github.com/elixir-lang/elixir" --source-ref "$(call SOURCE_REF)"
|
|
rm -rf ebin
|
|
|
|
../ex_doc/bin/ex_doc:
|
|
@ echo "ex_doc is not found in ../ex_doc as expected. See README for more information."
|
|
@ false
|
|
|
|
release_zip: compile
|
|
rm -rf v$(VERSION).zip
|
|
zip -9 -r v$(VERSION).zip bin CHANGELOG.md LEGAL lib/*/ebin LICENSE README.md rel VERSION
|
|
|
|
release_docs: docs
|
|
cd ../elixir-lang.github.com
|
|
rm -rf ../elixir-lang.github.com/docs/master
|
|
mv docs ../elixir-lang.github.com/docs/master
|
|
|
|
release_erl: compile
|
|
$(Q) rm -rf rel/elixir
|
|
$(Q) cd rel && ../rebar generate
|
|
|
|
#==> Tests tasks
|
|
|
|
test: test_erlang test_elixir
|
|
|
|
test_erlang: compile
|
|
@ echo "==> elixir (eunit)"
|
|
$(Q) mkdir -p lib/elixir/test/ebin
|
|
$(Q) $(ERLC) -pa lib/elixir/ebin -o lib/elixir/test/ebin lib/elixir/test/erlang/*.erl
|
|
$(Q) $(ERL) -pa lib/elixir/test/ebin -s test_helper test -s erlang halt;
|
|
@ echo ""
|
|
|
|
test_elixir: test_kernel test_ex_unit test_doc_test test_mix test_eex test_iex
|
|
|
|
test_doc_test: compile
|
|
@ echo "==> doctest (exunit)"
|
|
$(Q) cd lib/elixir && ../../bin/elixir -r "test/doc_test.exs";
|
|
|
|
test_kernel: compile
|
|
@ echo "==> kernel (exunit)"
|
|
$(Q) cd lib/elixir && ../../bin/elixir -r "test/elixir/test_helper.exs" -pr "test/elixir/**/*_test.exs";
|
|
|
|
.dialyzer.base_plt:
|
|
@ echo "==> Adding Erlang/OTP basic applications to a new base PLT"
|
|
$(Q) dialyzer --output_plt .dialyzer.base_plt --build_plt --apps erts kernel stdlib compiler tools syntax_tools parsetools
|
|
|
|
dialyze: .dialyzer.base_plt
|
|
$(Q) rm -f .dialyzer_plt
|
|
$(Q) cp .dialyzer.base_plt .dialyzer_plt
|
|
@ echo "==> Adding Elixir to PLT..."
|
|
$(Q) dialyzer --plt .dialyzer_plt --add_to_plt -r lib/elixir/ebin lib/ex_unit/ebin lib/eex/ebin lib/iex/ebin lib/mix/ebin
|
|
@ echo "==> Dialyzing Elixir..."
|
|
$(Q) dialyzer --plt .dialyzer_plt -r lib/elixir/ebin lib/ex_unit/ebin lib/eex/ebin lib/iex/ebin lib/mix/ebin
|