# -*- mode: makefile; coding: utf-8 -*- # Copyright (c) 2008-2009 Canonical Ltd. # Author(s): Alexander Sack # Fabien Tassin # Benjamin Drung # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2, or (at # your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # Usage: include this file in your CDBS debian/rules file and define the # following variables: # # MOZ_EXTENSION_PKG (OPTIONAL): # if defined the given binary package name is used to ship # this xpi; otherwise the first binary package listed in # debian/control is used # # MOZ_XPI_FILE (OPTIONAL): # if defined the given .xpi file is used; otherwise we try to # guess one using wildcard (*.xpi) # # MOZ_XPI_EMID (OPTIONAL): # if defined the given id is used to determine the link name # in the Firefox extensions directory. if not defined we try # our best to extract the em:id from the install.rdf file shipped # by any xpi # # MOZ_XPI_BUILD_COMMAND (OPTIONAL): # if defined the given command will be run _before_ the extension # gets packaged up the standard .xpi way. Thus, the build command # should produce an .xpi in top level directory. Note: If this # command is specified, all .xpi files in the top level directory # will be removed during |clean|. If the .xpi file will not be # build from source, you have to set this variable to nothing. # # MOZ_XPI_MOZILLA_EXTRA_DIRS (OPTIONAL): # TODO: implement this! # defines extra directories to link the extension in. Usually # xpi.mk creates the right links based on targetApplication # parsed in install.rdf; if you need more directories, use this. # # MOZ_XPI_DOCUMENTED_LICENSE_FILES (OPTIONAL): # defines extra license files which need to be excluded during # the installation of the XPI file to the packaging tree. When # using parameter, be sure that you documented _all_ excluded # license files in debian/copyright appropriately. If not defined # the common license file names are guessed. # # MOZ_XPI_EXT_NAME (OPTIONAL): # defines the name of the extension (without any prefixes like # mozilla- or xul-ext-). If not defined MOZ_EXTENSION_PKG with # stripped prefixes is used. This value is used to determine # xpi:Provides. # # MOZ_XPI_PRESERVE_PERMISSIONS (OPTIONAL): # if defined (set to 1), the permission of the installed files # will not be changed. If not defined or set to $(null), the # permission of the files will be set to 644 and the permissions # of scripts (files containing a shebang) will be set to 755. # # Deprecated variables: # # MOZ_XPI_MOZILLA_DIRS /deprecated/ (OPTIONAL/NODEFAULT - see "Note:"): # defines in which directories to create links for this # extension. The default is "firefox-addons", which means that # the extension will be linked appropriately to the # /usr/lib/firefox-addons/extensions directory. # '''Note''': this variable is deprecated and will go away; the # default is already empty; if you still need this variable, # migrate your code to MOZ_XPI_MOZILLA_EXTRA_DIRS # # MOZ_EXT_NAME /deprecated/ (OPTIONAL): # this variable is deprecated and will go away; it was renamed # to MOZ_XPI_EXT_NAME # MOZ_EXTENSION_PKG ?= $(strip $(shell grep ^Package: debian/control | head -n 1 | sed "s/^Package://")) MOZ_XPI_ARCH := $(strip $(shell egrep '^Package:|^Architecture:' debian/control | grep -A1 '^Package:[ \t]*$(MOZ_EXTENSION_PKG)[ \t]*$$' | grep ^Architecture: | sed -e 's/Architecture://')) MOZ_XPI_BUILD_COMMAND ?= xpi-pack $(CURDIR) $(MOZ_EXTENSION_PKG).xpi ifneq (,$(MOZ_XPI_FILE)) XPI_FILE = $(wildcard $(MOZ_XPI_FILE)) else XPI_FILE = $(wildcard *.xpi) endif XPI_BASE_FILE = $(notdir $(XPI_FILE)) ifneq (,$(MOZ_XPI_EMID)) XPI_EMID = $(MOZ_XPI_EMID) else XPI_EMID = $(shell xpath -q -e '/node()/Description/em:id/text() | /node()/Description/@em:id | //RDF:Description[@RDF:about="urn:mozilla:install-manifest"]/em:id/text() | //RDF:Description[@RDF:about="urn:mozilla:install-manifest"]/@em:id' $(install_dir)/install.rdf 2>/dev/null | sed -e 's/.*"\(.*\)"/\1/') endif ifeq (,$(MOZ_XPI_DISABLE_AUTOLINKS)) RDF_RESOURCES = $(shell xpath -q -e '//em:targetApplication/@RDF:resource' $(install_dir)/install.rdf 2>/dev/null | sed -e 's/.*="\(.*\)"/\1/') XPI_TARGET_EMIDs = \ $(shell xpath -q -e '//em:targetApplication//em:id/text() | //em:targetApplication//@em:id' $(install_dir)/install.rdf 2>/dev/null | sed -e 's/.*"\(.*\)"/\1/') \ $(foreach resource,$(RDF_RESOURCES),$(shell xpath -q -e '//RDF:Description[@RDF:about="$(resource)"]/@em:id' $(install_dir)/install.rdf 2>/dev/null | sed -e 's/.*"\(.*\)"/\1/')) endif # local vars # + lib_share_dir - for arch all this is "share"; otherwise "lib" ifeq (all, $(MOZ_XPI_ARCH)) lib_share_dir := share else lib_share_dir := lib endif install_dir := debian/$(MOZ_EXTENSION_PKG)/usr/$(lib_share_dir)/$(MOZ_EXTENSION_PKG) # ### cdbs hooks # build xpi using MOZ_XPI_BUILD_COMMAND if defined build/$(MOZ_EXTENSION_PKG):: ifneq (,$(MOZ_XPI_BUILD_COMMAND)) $(MOZ_XPI_BUILD_COMMAND) endif install/$(MOZ_EXTENSION_PKG):: xpi-install # ### general helper targets install-%-stamp: $(XPI_FILE) @if test ! -f "$^" -a -f "$<"; then \ echo "xpi.mk: Failed to extract the xpi file, there are multiple: $^"; \ echo "xpi.mk: Either create only one xpi file or specify MOZ_XPI_FILE!"; \ exit 1; \ fi mkdir -p $(install_dir) ifneq (,$(MOZ_XPI_DOCUMENTED_LICENSE_FILES)) unzip -o -d $(install_dir) $^ -x $(MOZ_XPI_DOCUMENTED_LICENSE_FILES) else unzip -o -d $(install_dir) $^ ifeq ($(origin MOZ_XPI_DOCUMENTED_LICENSE_FILES),undefined) cd $(install_dir) && find \( -iname copying -o -iname gpl.txt -o -iname licen[cs]e -o -iname licen[cs]e.txt \) -printf "xpi.mk: deleted %p\n" -delete endif endif ifeq (,$(MOZ_XPI_PRESERVE_PERMISSIONS)) find $(install_dir) -type d -exec chmod 755 {} \; cd $(install_dir) && find * -type f | while read fn; do head -n1 "$$fn" | grep -q "^\#\!" && echo "xpi.mk: Made $$fn executable." && chmod 755 "$$fn" || chmod 644 "$$fn"; done endif touch $@ installlinks-%-stamp: $(patsubst %,install-%-stamp,$(XPI_BASE_FILE)) dh_link -p$(MOZ_EXTENSION_PKG) /usr/$(lib_share_dir)/$(MOZ_EXTENSION_PKG) /usr/lib/$*/extensions/$(XPI_EMID) touch $@ autolinks-stamp: $(patsubst %,install-%-stamp,$(XPI_BASE_FILE)) $(foreach mozilla,$(MOZ_XPI_MOZILLA_DIRS),installlinks-$(mozilla)-stamp) $(if $(XPI_FILE),,@echo "xpi.mk: No xpi file found. Did you create one?"; \ echo "xpi.mk: Please check MOZ_XPI_BUILD_COMMAND and maybe MOZ_XPI_FILE!"; \ exit 2) $(if $(XPI_EMID),,@echo "xpi.mk: Detecting the extension manager ID failed."; \ echo "xpi.mk: This is either a bug in the install.rdf file or in mozilla-devscripts."; \ echo "xpi.mk: Patch the install.rdf file or use MOZ_XPI_EMID as workaround."; \ exit 3) $(foreach id,$(XPI_TARGET_EMIDs),dh_link -p$(MOZ_EXTENSION_PKG) /usr/$(lib_share_dir)/$(MOZ_EXTENSION_PKG) /usr/lib/mozilla/extensions/$(id)/$(XPI_EMID);) touch $@ xpi-install: $(patsubst %,install-%-stamp,$(XPI_BASE_FILE)) autolinks-stamp dh_xul-ext -p$(MOZ_EXTENSION_PKG) ifneq ($(shell grep '$${xpi:Depends}' debian/control),) @echo 'xpi.mk: $${xpi:Depends} is deprecated, please use $${xpi:Recommends} instead.' if test -f debian/$(MOZ_EXTENSION_PKG).substvars; then sed -i '/^xpi:Depends=/d' debian/$(MOZ_EXTENSION_PKG).substvars; fi grep '^xpi:Recommends=' debian/$(MOZ_EXTENSION_PKG).substvars | sed "s/^xpi:Recommends=/xpi:Depends=/g" >> debian/$(MOZ_EXTENSION_PKG).substvars endif # clean build and remove all .xpi in top-level if a MOZ_XPI_BUILD_COMMAND is defined clean:: dh_testdir dh_clean ifeq ($(shell expr $(shell cat debian/compat) '<' 7),1) rm -f *-stamp endif ifneq (,$(MOZ_XPI_BUILD_COMMAND)) rm -f *.xpi endif # debug target print-vars: @echo "install_dir: $(install_dir)" @echo "XPI_EMID: $(XPI_EMID)" @echo "RDF_RESOURCES: $(RDF_RESOURCES)" @echo "XPI_TARGET_EMIDs: $(XPI_TARGET_EMIDs)" .PHONY: clean xpi-install print-vars