# # Front-end based on GNU make, intended for a more friendly # integration of the build system with Linux/UNIX distributions, # as well as for those who still allergy using mach command. # # Place it as `mozilla/GNUmakefile' (instead of the existing stub), # and work under `mozilla/' dir. # # # For build, just use # # make # # (If you want to separate config stage, use "make configure" and then "make", # but normally it is done automatically). # # For install, use # # make install DESTDIR=where_you_want_to_install # # # Additionally, before install you can use: # # make locales # # to provide all the shipped locales (will appear in a form of langpack extensions). # If irc and/or calendar included, they will be prepared properly. # (See below for more details about locales target). # # # For clarity, some comparison with the other build methods # (assume `-jN' is the option for parallel builds, ie. `-j4' for 4-cpu system): # # Build stage: # # client.mk: make -f client.mk build MOZ_MAKE_FLAGS=-jN # mach: ./mach build -jN # THIS: make -jN # # Install stage: # # client.mk: DESTDIR=where... make -f client.mk install # mach: DESTDIR=where... make -C $OBJDIR... install # THIS: make install DESTDIR=where... # ifeq (,$(wildcard .mozconfig)) $(error Cannot find .mozconfig file in the current directory) endif MACH_CMD = ./mach --log-no-times OBJDIR := $(shell $(MACH_CMD) environment --format=json | sed -e 's/.*"topobjdir": "//' -e 's/".*//') OBJDIR_TARGETS = install distribution source-package package clobber .PHONY: all configure build clean distclean $(OBJDIR_TARGETS) all: build configure: $(OBJDIR)/Makefile $(OBJDIR)/Makefile: .mozconfig $(MACH_CMD) configure build: $(OBJDIR)/Makefile $(MAKE) -C $(OBJDIR) $(OBJDIR_TARGETS): $(MAKE) -C $(OBJDIR) $@ clean: $(MACH_CMD) clobber distclean: clean rm -f configure js/src/configure rm -rf $(OBJDIR) # # LOCALES # # # By default, all available locales will be used. You can change it # by overriding SHIPPED_LOCALES variable on the command line. # # The target `locales' performs all the needed work. It depends on # `locales-all' and `repacks'. First builds all needed langpacks, # second checks whether irc and/or calendar extensions are built # and prepares them by required additional locales. # # Some internal targets might be useful too, fe. `make locale-LANG' # to create one (or several) langpack separately. # # For example, to build all with `fr' and 'it' only, use: # # make locales SHIPPED_LOCALES="fr it" # # to create just `ru' langpack: # # make locale-ru # # Use `clear-locales' and `clear-repacks' for clearing. # # # NOTE! NOTE! NOTE! # # Do NOT use parallel builds (-jN) for locale targets! # # It is better to use `-j1' explicitly (`make -j1 locales') to avoid issues. # .PHONY: locales locales-all repacks clear-locales clear-repacks dictionaries clear-dictionaries drop_extra := $(if $(or $(filter Windows_NT,$(OS)),$(filter-out Darwin,$(shell uname))),ja-JP-mac,ja) SHIPPED_LOCALES := $(shell while read loc rest; do echo $$loc; done >$(PACKAGE_MANIFEST) clear-locales: sed -i '/langpack-.*@seamonkey.mozilla.org.xpi/ d' $(PACKAGE_MANIFEST) rm -f $(OBJDIR)/dist/bin/extensions/langpack-*@seamonkey.mozilla.org.xpi # # REPACKS # ext_dir := $(OBJDIR)/dist/bin/extensions CAL_NAME = {e2fda1a4-762b-4020-b5ad-a41df1933103} IRC_NAME = {59c81df5-4b7a-477b-912d-4e0fdf64e5f2} repack-$(CAL_NAME): LOCALE_PATH = $(OBJDIR)/dist/xpi-stage/locale-*/extensions/$(CAL_NAME) repack-$(CAL_NAME): MANIFEST_FILE = chrome.manifest repack-$(IRC_NAME): LOCALE_PATH = $(OBJDIR)/dist/xpi-stage/chatzilla-* repack-$(IRC_NAME): MANIFEST_FILE = chrome/chatzilla.manifest repack-%: tmp_dir = $(OBJDIR)/tmp-$* repack-%: all_manifests = $(foreach loc,$(SHIPPED_LOCALES),$(subst *,$(loc),$(LOCALE_PATH)/$(MANIFEST_FILE))) repack-cal: repack-$(CAL_NAME) repack-irc: repack-$(IRC_NAME) define _ADD_LOCALE while read line; \ do \ [ "$${line#locale}" = "$$line" ] && continue; \ tar -C $(dir $(manifest)) -chf - $${line##* } | tar -C $(dir $(tmp_dir)/$(MANIFEST_FILE)) -xf -; \ echo $$line >>$(tmp_dir)/$(MANIFEST_FILE); \ done < $(manifest) endef # do not remove the blank line! repack-%: $(ext_dir)/%.xpi $(SHIPPED_LOCALES:%=$(stage)-%) mkdir $(tmp_dir) cd $(tmp_dir); unzip $< $(foreach manifest,$(wildcard $(all_manifests)),$(_ADD_LOCALE)) mf=$(tmp_dir)/$(MANIFEST_FILE); sort $$mf >$$mf.new && mv -f $$mf.new $$mf [ -f $<.orig ] && rm -f $< || mv -f $< $<.orig cd $(tmp_dir); zip -r -9 -D -X $< . rm -rf $(tmp_dir) clear-repacks: for ext in $(CAL_NAME) $(IRC_NAME); \ do \ [ -f $(ext_dir)/$$ext.xpi.orig ] && mv -f $(ext_dir)/$$ext.xpi.orig $(ext_dir)/$$ext.xpi || : ; \ done ext_deps := $(patsubst $(ext_dir)/%.xpi,repack-%,$(wildcard $(ext_dir)/$(CAL_NAME).xpi $(ext_dir)/$(IRC_NAME).xpi)) ext_deps := $(strip $(ext_deps)) repacks: $(ext_deps) locales: locales-all repacks # # Dictionaries # # It is better to use system dictionaries, specifying directory path for them # by "spellchecker.dictionary_path" preference (or even use symlink if possible). # DICT_DEST := $(OBJDIR)/dist/bin/dictionaries dictionaries: $(SHIPPED_LOCALES:%=$(stage)-%) cp -f -d $(wildcard $(foreach loc,$(SHIPPED_LOCALES),$(stage)-$(loc)/dictionaries/$(loc).aff $(stage)-$(loc)/dictionaries/$(loc).dic)) $(DICT_DEST) clear-dictionaries: rm -f $(filter-out $(DICT_DEST)/en-US.%,$(wildcard $(DICT_DEST)/*.aff $(DICT_DEST)/*.dic))