123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- ################################################################################
- # 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)
|