257 lines
8.5 KiB
Makefile
257 lines
8.5 KiB
Makefile
################################################################################
|
|
# rebar package infrastructure for Erlang packages
|
|
#
|
|
# This file implements an infrastructure that eases development of
|
|
# package .mk files for rebar packages. It should be used for all
|
|
# packages that use rebar as their build system.
|
|
#
|
|
# In terms of implementation, this rebar infrastructure requires the
|
|
# .mk file to only specify metadata information about the package:
|
|
# name, version, download URL, etc.
|
|
#
|
|
# We still allow the package .mk file to override what the different
|
|
# steps are doing, if needed. For example, if <PKG>_BUILD_CMDS is
|
|
# already defined, it is used as the list of commands to perform to
|
|
# build the package, instead of the default rebar behaviour. The
|
|
# package can also define some post operation hooks.
|
|
#
|
|
################################################################################
|
|
|
|
# Directories to store rebar dependencies in.
|
|
#
|
|
# These directories actually only contain symbolic links to Erlang
|
|
# applications in either $(HOST_DIR) or $(STAGING_DIR). One needs
|
|
# them to avoid rebar complaining about missing dependencies, as this
|
|
# infrastructure tells rebar to NOT download dependencies during
|
|
# the build stage.
|
|
#
|
|
REBAR_HOST_DEPS_DIR = $(HOST_DIR)/share/rebar/deps
|
|
REBAR_TARGET_DEPS_DIR = $(STAGING_DIR)/usr/share/rebar/deps
|
|
|
|
# Tell rebar where to find the dependencies
|
|
#
|
|
REBAR_HOST_DEPS_ENV = \
|
|
ERL_COMPILER_OPTIONS='{i, "$(REBAR_HOST_DEPS_DIR)"}' \
|
|
ERL_EI_LIBDIR=$(HOST_DIR)/lib/erlang/lib/erl_interface-$(ERLANG_EI_VSN)/lib
|
|
REBAR_TARGET_DEPS_ENV = \
|
|
ERL_COMPILER_OPTIONS='{i, "$(REBAR_TARGET_DEPS_DIR)"}' \
|
|
ERL_EI_LIBDIR=$(STAGING_DIR)/usr/lib/erlang/lib/erl_interface-$(ERLANG_EI_VSN)/lib
|
|
|
|
################################################################################
|
|
# Helper functions
|
|
################################################################################
|
|
|
|
# Install an Erlang application from $(@D).
|
|
#
|
|
# i.e., define a recipe that installs the "bin ebin priv $(2)" directories
|
|
# from $(@D) to $(1)/$($(PKG)_ERLANG_LIBDIR).
|
|
#
|
|
# argument 1 should typically be $(HOST_DIR), $(TARGET_DIR),
|
|
# or $(STAGING_DIR).
|
|
# argument 2 is typically empty when installing in $(TARGET_DIR) and
|
|
# "include" when installing in $(HOST_DIR) or
|
|
# $(STAGING_DIR).
|
|
#
|
|
# Note: calling this function must be done with $$(call ...) because it
|
|
# expands package-related variables.
|
|
#
|
|
define install-erlang-directories
|
|
$(INSTALL) -d $(1)/$($(PKG)_ERLANG_LIBDIR)
|
|
for dir in bin ebin priv $(2); do \
|
|
if test -d $(@D)/$$dir; then \
|
|
cp -r $(@D)/$$dir $(1)/$($(PKG)_ERLANG_LIBDIR); \
|
|
fi; \
|
|
done
|
|
endef
|
|
|
|
# Setup a symbolic link in rebar's deps_dir to the actual location
|
|
# where an Erlang application is installed.
|
|
#
|
|
# i.e., define a recipe that creates a symbolic link
|
|
# from $($(PKG)_REBAR_DEPS_DIR)/$($(PKG)_ERLANG_APP)
|
|
# to $(1)$($(PKG)_ERLANG_LIBDIR).
|
|
#
|
|
# For target packages for example, one uses this to setup symbolic
|
|
# links from $(STAGING_DIR)/usr/share/rebar/deps/<erlang-app> to
|
|
# $(STAGING_DIR)/usr/lib/erlang/lib/<erlang-app>-<version>. This
|
|
# infrastructure points rebar at the former in order to tell rebar to
|
|
# NOT download dependencies during the build stage, and instead use
|
|
# the already available dependencies.
|
|
#
|
|
# Therefore,
|
|
# argument 1 is $(HOST_DIR) (for host packages) or
|
|
# $(STAGING_DIR) (for target packages).
|
|
#
|
|
# argument 2 is HOST (for host packages) or
|
|
# TARGET (for target packages).
|
|
#
|
|
# Note: calling this function must be done with $$(call ...) because it
|
|
# expands package-related variables.
|
|
#
|
|
define install-rebar-deps
|
|
$(INSTALL) -d $(REBAR_$(2)_DEPS_DIR)
|
|
ln -f -s $(1)/$($(PKG)_ERLANG_LIBDIR) \
|
|
$(REBAR_$(2)_DEPS_DIR)/$($(PKG)_ERLANG_APP)
|
|
endef
|
|
|
|
# Remove the "deps" statement from a rebar.config file
|
|
define remove-rebar-config-dependencies
|
|
$(SED) '/^{deps.*}\.$$/d' -e '/^{deps/,/}\.$$/d' \
|
|
$($(PKG)_DIR)/rebar.config
|
|
endef
|
|
|
|
|
|
################################################################################
|
|
# inner-rebar-package -- defines how the configuration, compilation
|
|
# and installation of a rebar package should be done, implements a few
|
|
# hooks to tune the build process according to rebar specifities, and
|
|
# calls the generic package infrastructure to generate the necessary
|
|
# make targets.
|
|
#
|
|
# argument 1 is the lowercase package name
|
|
# argument 2 is the uppercase package name, including a HOST_ prefix
|
|
# for host packages
|
|
# argument 3 is the uppercase package name, without the HOST_ prefix
|
|
# for host packages
|
|
# argument 4 is the type (target or host)
|
|
#
|
|
################################################################################
|
|
|
|
define inner-rebar-package
|
|
|
|
# Extract just the raw package name, lowercase without the leading
|
|
# erlang- or host- prefix, as this is used by rebar to find the
|
|
# dependencies a package specifies.
|
|
#
|
|
$(2)_ERLANG_APP = $(subst -,_,$(patsubst erlang-%,%,$(patsubst host-%,%,$(1))))
|
|
|
|
# Path where to store the package's libs, relative to either $(HOST_DIR)
|
|
# for host packages, or $(STAGING_DIR)/usr for target packages.
|
|
#
|
|
$(2)_ERLANG_LIBDIR = \
|
|
lib/erlang/lib/$$($$(PKG)_ERLANG_APP)-$$($$(PKG)_VERSION)
|
|
|
|
# If a host package, inherit <pkg>_USE_BUNDLED_REBAR from the target
|
|
# package, if not explicitly defined. Otherwise, default to NO.
|
|
ifndef $(2)_USE_BUNDLED_REBAR
|
|
ifdef $(3)_USE_BUNDLED_REBAR
|
|
$(2)_USE_BUNDLED_REBAR = $$($(3)_USE_BUNDLED_REBAR)
|
|
else
|
|
$(2)_USE_BUNDLED_REBAR ?= NO
|
|
endif
|
|
endif
|
|
|
|
# If a host package, inherit <pkg>_USE_AUTOCONF from the target
|
|
# package, if not explicitly defined. Otherwise, default to NO.
|
|
ifndef $(2)_USE_AUTOCONF
|
|
ifdef $(3)_USE_AUTOCONF
|
|
$(2)_USE_AUTOCONF = $$($(3)_USE_AUTOCONF)
|
|
else
|
|
$(2)_USE_AUTOCONF ?= NO
|
|
endif
|
|
endif
|
|
|
|
# Define the build and install commands
|
|
#
|
|
ifeq ($(4),target)
|
|
|
|
# Target packages need the erlang interpreter on the target
|
|
$(2)_DEPENDENCIES += erlang
|
|
|
|
# Used only if the package uses autotools underneath; otherwise, ignored
|
|
$(2)_CONF_ENV += $$(REBAR_TARGET_DEPS_ENV)
|
|
|
|
ifndef $(2)_BUILD_CMDS
|
|
define $(2)_BUILD_CMDS
|
|
(cd $$(@D); \
|
|
CC="$$(TARGET_CC)" \
|
|
CXX="$$(TARGET_CXX)" \
|
|
CFLAGS="$$(TARGET_CFLAGS)" \
|
|
CXXFLAGS="$$(TARGET_CXXFLAGS)" \
|
|
LDFLAGS="$$(TARGET_LDFLAGS)" \
|
|
$$(REBAR_TARGET_DEPS_ENV) \
|
|
$$(TARGET_MAKE_ENV) \
|
|
$$($$(PKG)_REBAR_ENV) $$($$(PKG)_REBAR) deps_dir=$$(REBAR_TARGET_DEPS_DIR) compile \
|
|
)
|
|
endef
|
|
endif
|
|
|
|
# We need to double-$ the 'call' because it wants to expand
|
|
# package-related variables
|
|
ifndef $(2)_INSTALL_STAGING_CMDS
|
|
define $(2)_INSTALL_STAGING_CMDS
|
|
$$(call install-erlang-directories,$$(STAGING_DIR)/usr,include)
|
|
$$(call install-rebar-deps,$$(STAGING_DIR)/usr,TARGET)
|
|
endef
|
|
endif
|
|
|
|
# We need to double-$ the 'call' because it wants to expand
|
|
# package-related variables
|
|
ifndef $(2)_INSTALL_TARGET_CMDS
|
|
define $(2)_INSTALL_TARGET_CMDS
|
|
$$(call install-erlang-directories,$$(TARGET_DIR)/usr)
|
|
endef
|
|
endif
|
|
|
|
else # !target
|
|
|
|
# Host packages need the erlang interpreter on the host
|
|
$(2)_DEPENDENCIES += host-erlang
|
|
|
|
# Used only if the package uses autotools underneath; otherwise, ignored
|
|
$(2)_CONF_ENV += $$(REBAR_HOST_DEPS_ENV)
|
|
|
|
ifndef $(2)_BUILD_CMDS
|
|
define $(2)_BUILD_CMDS
|
|
(cd $$(@D); \
|
|
CC="$$(HOSTCC)" \
|
|
CFLAGS="$$(HOST_CFLAGS)" \
|
|
LDFLAGS="$$(HOST_LDFLAGS)" \
|
|
$$(REBAR_HOST_DEPS_ENV) \
|
|
$$(HOST_MAKE_ENV) \
|
|
$$($$(PKG)_REBAR_ENV) $$($$(PKG)_REBAR) deps_dir=$$(REBAR_HOST_DEPS_DIR) compile \
|
|
)
|
|
endef
|
|
endif
|
|
|
|
# We need to double-$ the 'call' because it wants to expand
|
|
# package-related variables
|
|
ifndef $(2)_INSTALL_CMDS
|
|
define $(2)_INSTALL_CMDS
|
|
$$(call install-erlang-directories,$$(HOST_DIR),include)
|
|
$$(call install-rebar-deps,$$(HOST_DIR),HOST)
|
|
endef
|
|
endif
|
|
|
|
endif # !target
|
|
|
|
# Whether to use the generic rebar or the package's bundled rebar
|
|
#
|
|
ifeq ($$($(2)_USE_BUNDLED_REBAR),YES)
|
|
$(2)_REBAR = ./rebar
|
|
else
|
|
$(2)_REBAR = rebar
|
|
$(2)_DEPENDENCIES += host-erlang-rebar
|
|
endif
|
|
|
|
$(2)_KEEP_DEPENDENCIES ?= NO
|
|
|
|
# Remove dependencies listed in rebar.config unless the package says
|
|
# otherwise
|
|
ifeq ($$($(2)_KEEP_DEPENDENCIES),NO)
|
|
$(2)_POST_PATCH_HOOKS += remove-rebar-config-dependencies
|
|
endif
|
|
|
|
# The package sub-infra to use
|
|
#
|
|
ifeq ($$($(2)_USE_AUTOCONF),YES)
|
|
$(call inner-autotools-package,$(1),$(2),$(3),$(4))
|
|
else
|
|
$(call inner-generic-package,$(1),$(2),$(3),$(4))
|
|
endif
|
|
|
|
endef # inner-rebar-package
|
|
|
|
rebar-package = $(call inner-rebar-package,$(pkgname),$(call UPPERCASE,$(pkgname)),$(call UPPERCASE,$(pkgname)),target)
|
|
host-rebar-package = $(call inner-rebar-package,host-$(pkgname),$(call UPPERCASE,host-$(pkgname)),$(call UPPERCASE,$(pkgname)),host)
|