Current section

Files

Jump to
pooler concrete.mk
Raw

concrete.mk

# =============================================================================
# Verify that the programs we need to run are installed on this system
# =============================================================================
ERL = $(shell which erl)
ifeq ($(ERL),)
$(error "Erlang not available on this system")
endif
# If building on travis, use the rebar in the current directory
ifeq ($(TRAVIS),true)
REBAR = $(CURDIR)/rebar
endif
# If there is a rebar in the current directory, use it
ifeq ($(wildcard rebar),rebar)
REBAR = $(CURDIR)/rebar
endif
# Fallback to rebar on PATH
REBAR ?= $(shell which rebar)
# And finally, prep to download rebar if all else fails
ifeq ($(REBAR),)
REBAR = $(CURDIR)/rebar
endif
# If we have a rebar.config.lock file, use it!
ifeq ($(wildcard rebar.config.lock),rebar.config.lock)
REBAR_CONFIG = rebar.config.lock
else
REBAR_CONFIG = rebar.config
endif
# This is the variable to use to respect the lock file
REBARC = $(REBAR) -C $(REBAR_CONFIG)
# For use on Travis CI, skip dialyzer for R14 and R15. Newer versions
# have a faster dialyzer that is less likely to cause a build timeout.
DIALYZER = dialyzer
R14 = $(findstring R14,$(TRAVIS_OTP_RELEASE))
R15 = $(findstring R15,$(TRAVIS_OTP_RELEASE))
ifneq ($(R14),)
DIALYZER = echo "SKIPPING dialyzer"
endif
ifneq ($(R15),)
DIALYZER = echo "SKIPPING dialyzer"
endif
ifneq ($(SKIP_DIALYZER),)
DIALYZER = echo "SKIPPING dialyzer"
endif
REBAR_URL=https://github.com/rebar/rebar/wiki/rebar
DEPS ?= $(CURDIR)/deps
DIALYZER_OPTS ?=
# Find all the deps the project has by searching the deps dir
ALL_DEPS = $(notdir $(wildcard deps/*))
# Create a list of deps that should be used by dialyzer by doing a
# complement on the sets
DEPS_LIST = $(filter-out $(DIALYZER_SKIP_DEPS), $(ALL_DEPS))
# Create the path structure from the dep names
# so dialyzer can find the .beam files in the ebin dir
# This list is then used by dialyzer in creating the local PLT
DIALYZER_DEPS = $(foreach dep,$(DEPS_LIST),deps/$(dep)/ebin)
DEPS_PLT = deps.plt
ERLANG_DIALYZER_APPS ?= asn1 \
compiler \
crypto \
edoc \
erts \
inets \
kernel \
mnesia \
public_key \
ssl \
stdlib \
syntax_tools \
tools \
xmerl
PROJ = $(notdir $(CURDIR))
# Let's compute $(BASE_PLT_ID) that identifies the base PLT to use for this project
# and depends on your `$(ERLANG_DIALYZER_APPS)' list and your erlang version
ERLANG_VERSION := $(shell $(ERL) -eval 'io:format("~s~n", [erlang:system_info(otp_release)]), halt().' -noshell)
MD5_BIN := $(shell which md5 || which md5sum)
ifeq ($(MD5_BIN),)
# neither md5 nor md5sum, we just take the project name
BASE_PLT_ID := $(PROJ)
else
BASE_PLT_ID := $(word 1, $(shell echo $(ERLANG_DIALYZER_APPS) $(ERLANG_VERSION) | $(MD5_BIN)))
endif
BASE_PLT := ~/.concrete_dialyzer_plt_$(BASE_PLT_ID)_$(ERLANG_VERSION).plt
all: all_but_dialyzer dialyzer
all_but_dialyzer: .concrete/DEV_MODE compile eunit $(ALL_HOOK)
$(REBAR):
curl -Lo rebar $(REBAR_URL) || wget $(REBAR_URL)
chmod a+x rebar
get-rebar: $(REBAR)
.concrete/DEV_MODE:
@mkdir -p .concrete
@touch $@
# Clean ebin and .eunit of this project
clean:
@$(REBARC) clean skip_deps=true
# Clean this project and all deps
# Newer rebar requires -r to recursively clean
allclean:
@($(REBARC) --help 2>&1|grep -q recursive && $(REBARC) -r clean) || $(REBARC) clean
compile: $(DEPS)
@$(REBARC) compile
$(DEPS):
@$(REBARC) get-deps
# Full clean and removal of all deps. Remove deps first to avoid
# wasted effort of cleaning deps before nuking them.
distclean:
@rm -rf deps $(DEPS_PLT)
@$(REBARC) clean
eunit:
@$(REBARC) skip_deps=true eunit
test: eunit
# Only include local PLT if we have deps that we are going to analyze
ifeq ($(strip $(DIALYZER_DEPS)),)
dialyzer: $(BASE_PLT)
@$(DIALYZER) $(DIALYZER_OPTS) -r ebin
else
dialyzer: $(BASE_PLT) $(DEPS_PLT)
@$(DIALYZER) $(DIALYZER_OPTS) --plts $(BASE_PLT) $(DEPS_PLT) -r ebin
$(DEPS_PLT):
@$(DIALYZER) --build_plt $(DIALYZER_DEPS) --output_plt $(DEPS_PLT)
endif
$(BASE_PLT):
@echo "Missing $(BASE_PLT). Please wait while a new PLT is compiled."
$(DIALYZER) --build_plt --apps $(ERLANG_DIALYZER_APPS) --output_plt $(BASE_PLT)
@echo "now try your build again"
doc:
@$(REBARC) doc skip_deps=true
shell:
@$(ERL) -pa deps/*/ebin ebin .eunit
tags:
find src deps -name "*.[he]rl" -print | etags -
# Releases via relx. we will install a local relx, as we do for rebar,
# if we don't find one on PATH.
RELX_CONFIG ?= $(CURDIR)/relx.config
RELX = $(shell which relx)
RELX_OPTS ?=
RELX_OUTPUT_DIR ?= _rel
ifeq ($(RELX),)
RELX = $(CURDIR)/relx
RELX_VERSION = 1.0.4
else
RELX_VERSION = $(shell relx --version)
endif
RELX_URL = https://github.com/erlware/relx/releases/download/v$(RELX_VERSION)/relx
# relx introduced a breaking change in v1: the output doesn't have the same structure
# see https://github.com/erlware/relx/releases/tag/v1.0.0
ifeq ($(shell echo $(RELX_VERSION) | head -c 1), 0)
RELX_RELEASE_DIR = $(RELX_OUTPUT_DIR)
else
RELX_RELEASE_DIR = $(RELX_OUTPUT_DIR)/$(PROJ)
endif
$(RELX):
curl -Lo relx $(RELX_URL) || wget $(RELX_URL)
chmod a+x relx
rel: relclean all_but_dialyzer $(RELX)
@$(RELX) -c $(RELX_CONFIG) -o $(RELX_OUTPUT_DIR) $(RELX_OPTS)
devrel: rel
devrel: lib_dir=$(wildcard $(RELX_RELEASE_DIR)/lib/$(PROJ)-* )
devrel:
@/bin/echo Symlinking deps and apps into release
@rm -rf $(lib_dir); mkdir -p $(lib_dir)
@ln -sf `pwd`/ebin $(lib_dir)
@ln -sf `pwd`/priv $(lib_dir)
@ln -sf `pwd`/src $(lib_dir)
relclean:
rm -rf $(RELX_OUTPUT_DIR)
## Release prep and dep locking. These recipes use $(REBAR), not
## $(REBARC) in order to NOT use the lock file since they are
## concerned with the task of updating the lock file.
BUMP ?= patch
prepare_release: distclean unlocked_deps unlocked_compile update_locked_config rel
@echo 'release prepared, bumping version'
@$(REBAR) bump-rel-version version=$(BUMP)
unlocked_deps:
@echo 'Fetching deps as: rebar -C rebar.config'
@$(REBAR) -C rebar.config get-deps
# When running the prepare_release target, we have to ensure that a
# compile occurs using the unlocked rebar.config. If a dependency has
# been removed, then using the locked version that contains the stale
# dep will cause a compile error.
unlocked_compile:
@$(REBAR) -C rebar.config compile
update_locked_config:
@$(REBAR) lock-deps skip_deps=true
.PHONY: all all_but_dialyzer compile eunit test dialyzer clean allclean relclean distclean doc tags get-rebar rel devrel