123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- # Copyright (c) 2013-2016, Loïc Hoguin <essen@ninenines.eu>
- #
- # Permission to use, copy, modify, and/or distribute this software for any
- # purpose with or without fee is hereby granted, provided that the above
- # copyright notice and this permission notice appear in all copies.
- #
- # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- .PHONY: all app apps deps search rel relup docs install-docs check tests clean distclean help erlang-mk
- ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
- export ERLANG_MK_FILENAME
- ERLANG_MK_VERSION = rolling
- ERLANG_MK_WITHOUT =
- # Make 3.81 and 3.82 are deprecated.
- ifeq ($(MAKE_VERSION),3.81)
- $(warning Please upgrade to GNU Make 4 or later: https://erlang.mk/guide/installation.html)
- endif
- ifeq ($(MAKE_VERSION),3.82)
- $(warning Please upgrade to GNU Make 4 or later: https://erlang.mk/guide/installation.html)
- endif
- # Core configuration.
- PROJECT ?= $(notdir $(CURDIR))
- PROJECT := $(strip $(PROJECT))
- PROJECT_VERSION ?= rolling
- PROJECT_MOD ?= $(PROJECT)_app
- PROJECT_ENV ?= []
- # Verbosity.
- V ?= 0
- verbose_0 = @
- verbose_2 = set -x;
- verbose = $(verbose_$(V))
- gen_verbose_0 = @echo " GEN " $@;
- gen_verbose_2 = set -x;
- gen_verbose = $(gen_verbose_$(V))
- # Temporary files directory.
- ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
- export ERLANG_MK_TMP
- # "erl" command.
- ERL = erl +A0 -noinput -boot start_clean
- # Platform detection.
- ifeq ($(PLATFORM),)
- UNAME_S := $(shell uname -s)
- ifeq ($(UNAME_S),Linux)
- PLATFORM = linux
- else ifeq ($(UNAME_S),Darwin)
- PLATFORM = darwin
- else ifeq ($(UNAME_S),SunOS)
- PLATFORM = solaris
- else ifeq ($(UNAME_S),GNU)
- PLATFORM = gnu
- else ifeq ($(UNAME_S),FreeBSD)
- PLATFORM = freebsd
- else ifeq ($(UNAME_S),NetBSD)
- PLATFORM = netbsd
- else ifeq ($(UNAME_S),OpenBSD)
- PLATFORM = openbsd
- else ifeq ($(UNAME_S),DragonFly)
- PLATFORM = dragonfly
- else ifeq ($(shell uname -o),Msys)
- PLATFORM = msys2
- else
- $(error Unable to detect platform. Please open a ticket with the output of uname -a.)
- endif
- export PLATFORM
- endif
- # Core targets.
- all:: deps app rel
- # Noop to avoid a Make warning when there's nothing to do.
- rel::
- $(verbose) :
- relup:: deps app
- check:: tests
- clean:: clean-crashdump
- clean-crashdump:
- ifneq ($(wildcard erl_crash.dump),)
- $(gen_verbose) rm -f erl_crash.dump
- endif
- distclean:: clean distclean-tmp
- distclean-tmp:
- $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
- help::
- $(verbose) printf "%s\n" \
- "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
- "Copyright (c) 2013-2016 Loïc Hoguin <essen@ninenines.eu>" \
- "" \
- "Usage: [V=1] $(MAKE) [target]..." \
- "" \
- "Core targets:" \
- " all Run deps, app and rel targets in that order" \
- " app Compile the project" \
- " deps Fetch dependencies (if needed) and compile them" \
- " fetch-deps Fetch dependencies recursively (if needed) without compiling them" \
- " list-deps List dependencies recursively on stdout" \
- " search q=... Search for a package in the built-in index" \
- " rel Build a release for this project, if applicable" \
- " docs Build the documentation for this project" \
- " install-docs Install the man pages for this project" \
- " check Compile and run all tests and analysis for this project" \
- " tests Run the tests for this project" \
- " clean Delete temporary and output files from most targets" \
- " distclean Delete all temporary and output files" \
- " help Display this help and exit" \
- " erlang-mk Update erlang.mk to the latest version"
- # Core functions.
- empty :=
- space := $(empty) $(empty)
- tab := $(empty) $(empty)
- comma := ,
- define newline
- endef
- define comma_list
- $(subst $(space),$(comma),$(strip $(1)))
- endef
- define escape_dquotes
- $(subst ",\",$1)
- 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
- endef
- ifeq ($(PLATFORM),msys2)
- core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
- 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_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
- core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
- 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)))
- # @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)
- endef
- # Automated update.
- ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
- ERLANG_MK_COMMIT ?=
- ERLANG_MK_BUILD_CONFIG ?= build.config
- ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
- erlang-mk: WITHOUT ?= $(ERLANG_MK_WITHOUT)
- erlang-mk:
- ifdef ERLANG_MK_COMMIT
- git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
- cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
- else
- git clone --depth 1 $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
- endif
- if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
- $(MAKE) -C $(ERLANG_MK_BUILD_DIR) WITHOUT='$(strip $(WITHOUT))'
- cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
- rm -rf $(ERLANG_MK_BUILD_DIR)
- # The erlang.mk package index is bundled in the default erlang.mk build.
- # Search for the string "copyright" to skip to the rest of the code.
|