diff options
author | David Tardon <dtardon@redhat.com> | 2012-08-20 11:15:05 +0200 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2012-08-24 13:22:00 +0200 |
commit | df4ff3547078c17cf69f7574dd7995cc51cc7934 (patch) | |
tree | 201d8dc1231a7341b2159fdd4b4cb0b9293a606e /solenv/gbuild/UnpackedTarball.mk | |
parent | 5dc11d57f050c5e4c58843b18d76877c1005d067 (diff) |
add support for external tarballs to gbuild
Change-Id: Ic6645e9943b2445ebb37bb99114f777527c69af9
Diffstat (limited to 'solenv/gbuild/UnpackedTarball.mk')
-rw-r--r-- | solenv/gbuild/UnpackedTarball.mk | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/solenv/gbuild/UnpackedTarball.mk b/solenv/gbuild/UnpackedTarball.mk new file mode 100644 index 000000000000..8d85e01a7f29 --- /dev/null +++ b/solenv/gbuild/UnpackedTarball.mk @@ -0,0 +1,284 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +# UnpackedTarget class + +# Handles unpacking of a tarball + +# platform +# gb_UnpackedTarget_TARFILE_LOCATION + +gb_UnpackedTarget_STRIP_COMPONENTS_TAR_DEFAULT := 1 +gb_UnpackedTarget_STRIP_COMPONENTS_ZIP_DEFAULT := 0 + +# gb_UnpackedTarget__get_strip_components target strip-components? +define gb_UnpackedTarget__get_strip_components +$(strip $(if $(2),\ + $(2),\ + $(if $(filter zip,$(suffix $(1))),\ + $(gb_UnpackedTarget_STRIP_COMPONENTS_ZIP_DEFAULT),\ + $(gb_UnpackedTarget_STRIP_COMPONENTS_TAR_DEFAULT) \ + ) \ +)) +endef + +define gb_UnpackedTarget__command_untar +$(GNUTAR) \ + -x \ + $(3) \ + -C $(UNPACKED_DIR) \ + $(STRIP_COMPONENTS)=$(UNPACKED_STRIP_COMPONENTS) \ + -f $(UNPACKED_TARBALL) +endef + +define gb_UnpackedTarget__command_unzip +unzip \ + -qq \ + -DD \ + -d $(UNPACKED_DIR) $(UNPACKED_TARBALL) && \ +$(if $(filter-out 0,$(UNPACKED_STRIP_COMPONENTS)),\ + UNZIP_DIR=`ls $(UNPACKED_DIR)` && \ + mv $(UNPACKED_DIR)/$$UNZIP_DIR/* $(UNPACKED_DIR) && \ + rmdir $(UNPACKED_DIR)/$$UNZIP_DIR \ +) +endef + +define gb_UnpackedTarget__command +$(call gb_Output_announce,$(notdir $(2)),$(true),UPK,1) +$(call gb_Helper_abbreviate_dirs,\ + $(if $(wildcard $(UNPACKED_DIR)),rm -rf $(UNPACKED_DIR) &&) \ + mkdir -p $(UNPACKED_DIR) && \ + $(call gb_UnpackedTarget__command_$(1),$(2),$(3),$(4)) && \ + touch $(2) \ +) +endef + +$(dir $(call gb_UnpackedTarget_get_target,%)).dir : + $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@)) + +$(call gb_UnpackedTarget_get_target,%).tar.bz2 : + $(call gb_UnpackedTarget__command,untar,$@,$*,-j) + +$(call gb_UnpackedTarget_get_target,%).tar.gz : + $(call gb_UnpackedTarget__command,untar,$@,$*,-z) + +$(call gb_UnpackedTarget_get_target,%).tgz : + $(call gb_UnpackedTarget__command,untar,$@,$*,-z) + +$(call gb_UnpackedTarget_get_target,%).zip : + $(call gb_UnpackedTarget__command,unzip,$@,$*) + +.PHONY : $(call gb_UnpackedTarget_get_clean_target,%) +$(call gb_UnpackedTarget_get_clean_target,%) : + $(call gb_Output_announce,$*,$(false),UPK,1) + $(call gb_Helper_abbreviate_dirs,\ + rm -f $(call gb_UnpackedTarget_get_target,$*) \ + ) + +# gb_UnpackedTarget_UnpackedTarget target outdir strip-components? +define gb_UnpackedTarget_UnpackedTarget +$(call gb_UnpackedTarget_get_target,$(1)) : UNPACKED_DIR := $(2) +$(call gb_UnpackedTarget_get_target,$(1)) : UNPACKED_TARBALL := $(gb_UnpackedTarget_TARFILE_LOCATION)/$(1) +$(call gb_UnpackedTarget_get_target,$(1)) : UNPACKED_STRIP_COMPONENTS := $(call gb_UnpackedTarget__get_strip_components,$(1),$(3)) + +$(call gb_UnpackedTarget_get_target,$(1)) : $(gb_UnpackedTarget_TARFILE_LOCATION)/$(1) +$(call gb_UnpackedTarget_get_target,$(1)) :| $(dir $(call gb_UnpackedTarget_get_target,$(1))).dir + +endef + +# UnpackedTarball class + +# Handles unpacking and patching of an external project +# +# The unpacked dir is recreated every time one of the patches, copied +# files or the makefile changes. + +# This is what dmake patches use. Once all external modules are +# converted, it is better to be changed to 1. +gb_UnpackedTarball_PATCHLEVEL_DEFAULT := 3 + +define gb_UnpackedTarball__copy_files_impl +$(if $(1),\ + && cp $(firstword $(1)) $(firstword $(2)) \ + $(call gb_UnpackedTarball__copy_files_impl,$(wordlist 2,$(words $(1)),$(1)),$(wordlist 2,$(words $(2)),$(2))) \ +) +endef + +# Drop leading && +define gb_UnpackedTarball__copy_files_fix +$(wordlist 2,$(words $(1)),$(1)) +endef + +define gb_UnpackedTarball__copy_files +$(call gb_UnpackedTarball__copy_files_fix,$(call gb_UnpackedTarball__copy_files_impl,$(1),$(2))) +endef + +define gb_UnpackedTarball__command +$(call gb_Output_announce,$(2),$(true),PAT,2) +$(call gb_Helper_abbreviate_dirs,\ + cd $(3) && \ + $(if $(UNPACKED_PATCHES),\ + for p in $(UNPACKED_PATCHES); do \ + $(GNUPATCH) -s -p$(UNPACKED_PATCHLEVEL) < "$$p" || exit 1;\ + done && \ + ) \ + $(if $(UNPACKED_CXX_SUFFIX),\ + for c in `find $(3) -type f -name "*.$(UNPACKED_CXX_SUFFIX)"`; do \ + mv "$$c" "$${c%.$(UNPACKED_CXX_SUFFIX)}.cxx" || exit 1;\ + done && \ + ) \ + $(if $(UNPACKED_FILES),\ + mkdir -p $(sort $(dir $(UNPACKED_DESTFILES))) && \ + $(call gb_UnpackedTarball__copy_files,$(UNPACKED_FILES),$(UNPACKED_DESTFILES)) && \ + ) \ + $(if $(UNPACKED_POST_ACTION),\ + $(UNPACKED_POST_ACTION) && \ + ) \ + touch $(1) \ +) +endef + +$(dir $(call gb_UnpackedTarball_get_target,%)).dir : + $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@)) + +$(call gb_UnpackedTarball_get_preparation_target,%) : + touch $@ + +$(call gb_UnpackedTarball_get_target,%) : + $(call gb_UnpackedTarball__command,$@,$*,$(call gb_UnpackedTarball_get_dir,$*)) + +.PHONY : $(call gb_UnpackedTarball_get_clean_target,%) +$(call gb_UnpackedTarball_get_clean_target,%) : + $(call gb_Output_announce,$*,$(false),PAT,2) + $(call gb_Helper_abbreviate_dirs,\ + rm -rf \ + $(call gb_UnpackedTarball_get_target,$*) \ + $(call gb_UnpackedTarball_get_preparation_target,$*) \ + $(call gb_UnpackedTarball_get_dir,$*) \ + ) + +# Initialize unpacked tarball +define gb_UnpackedTarball_UnpackedTarball_internal +$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_CXX_SUFFIX := +$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_DESTFILES := +$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_FILES := +$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_PATCHES := +$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_PATCHLEVEL := $(gb_UnpackedTarball_PATCHLEVEL_DEFAULT) +$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_POST_ACTION := + +$(call gb_UnpackedTarball_get_preparation_target,$(1)) : $(lastword $(MAKEFILE_LIST)) +$(call gb_UnpackedTarball_get_preparation_target,$(1)) :| $(dir $(call gb_UnpackedTarball_get_target,$(1))).dir +$(call gb_UnpackedTarball_get_target,$(1)) : $(call gb_UnpackedTarball_get_preparation_target,$(1)) +$(call gb_UnpackedTarball_get_target,$(1)) :| $(dir $(call gb_UnpackedTarball_get_target,$(1))).dir + +endef + +# Define a new unpacked tarball +define gb_UnpackedTarball_UnpackedTarball +$(call gb_UnpackedTarball_UnpackedTarball_internal,$(1)) + +$$(eval $$(call gb_Module_register_target,$(call gb_UnpackedTarball_get_target,$(1)),$(call gb_UnpackedTarball_get_clean_target,$(1)))) + +endef + +# Set suffix of C++ files, if different from 'cxx' +# +# All files with that extension will be renamed to .cxx . This is because +# LinkTarget requires .cxx extension for C++ files. +# +# This is done after applying patches. +# +# gb_UnpackedTarball_fix_cxx_suffix unpacked used-suffix +define gb_UnpackedTarball_fix_cxx_suffix +$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_CXX_SUFFIX := $(2) + +endef + +# Set tarball name +# +# gb_UnpackedTarball_set_tarball unpacked tarball-name +define gb_UnpackedTarball_set_tarball +$(call gb_UnpackedTarget_UnpackedTarget,$(2),$(call gb_UnpackedTarball_get_dir,$(1)),$(3)) +$(call gb_UnpackedTarball_get_target,$(1)) : $(call gb_UnpackedTarget_get_target,$(2)) +$(call gb_UnpackedTarball_get_clean_target,$(1)) : $(call gb_UnpackedTarget_get_clean_target,$(2)) +$(call gb_UnpackedTarget_get_target,$(2)) : $(call gb_UnpackedTarball_get_preparation_target,$(1)) + +endef + +# Set patch level to be used for all patches +# +# The default value is 3 to be able to work with current dmake patches. +# +# gb_UnpackedTarball_set_patchlevel unpacked level +define gb_UnpackedTarball_set_patchlevel +$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_PATCHLEVEL := $(2) + +endef + +# Add a patch to be applied on the unpacked files +# +# gb_UnpackedTarball_add_patch unpacked patch +define gb_UnpackedTarball_add_patch +$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_PATCHES += $(SRCDIR)/$(2) +$(call gb_UnpackedTarball_get_preparation_target,$(1)) : $(SRCDIR)/$(2) + +endef + +# Add several patches at once +# +# gb_UnpackedTarball_add_patches unpacked patch(es) +define gb_UnpackedTarball_add_patches +$(foreach patch,$(2),$(call gb_UnpackedTarball_add_patch,$(1),$(patch))) + +endef + +# Add a file from source dir to the unpacked dir +# +# This function should not be used for overwriting existing files--use a +# patch for that purpose. +# +# gb_UnpackedTarball_add_file unpacked destfile file +define gb_UnpackedTarball_add_file +$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_FILES += $(SRCDIR)/$(3) +$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_DESTFILES += $(call gb_UnpackedTarball_get_dir,$(1))/$(2) +$(call gb_UnpackedTarball_get_preparation_target,$(1)) : $(SRCDIR)/$(3) + +endef + +# Add several files(s) from source dir to the unpacked dir +# +# The files are added into the specified subdir. +# +# gb_UnpackedTarball_add_files unpacked subdir file(s) +define gb_UnpackedTarball_add_files +$(foreach file,$(3),$(call gb_UnpackedTarball_add_file,$(1),$(2)/$(notdir $(file)),$(file))) + +endef + +# Set arbitrary shell command to be run during unpack +# +# The command is run at the very end: after patching, C++ extension +# mangling and copying additional files in. The command is run in the +# unpacked directory. If more than one command is used, care should be +# taken that the whole command fails if either of the sub-commands +# fails. +# +# NOTE: This is a bit hackish, but it is the easiest way to move files +# around or delete files (typically because the file causes build +# problems in the original location, c.f. clucene). This is doable by +# using -E with patch (we use GNU patch anyway), but it would mean an +# additional patch to maintain.... +# +# gb_UnpackedTarball_set_post_action unpacked shell-command +define gb_UnpackedTarball_set_post_action +$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_POST_ACTION := $(strip $(2)) + +endef + +# vim: set noet sw=4 ts=4: |