diff options
author | David Tardon <dtardon@redhat.com> | 2012-09-21 16:26:00 +0200 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2012-09-22 14:57:28 +0200 |
commit | 98a852fe6af082fc9c9679841dc390b4635888d4 (patch) | |
tree | ad8d01f30806a6281a11e11ab1abb32dc079bc52 /solenv | |
parent | 9f42a82937accb19549971ebfe945c7e8273b58c (diff) |
add gbuild class ExternalPackage
This should make delivering of header files (but other kinds of files
too) from the unpacked tarballs more reliable with respect to project
updates.
Change-Id: Ic9dac800eddecedffba5f955f1e8d585da9c1b17
Diffstat (limited to 'solenv')
-rw-r--r-- | solenv/gbuild/ExternalPackage.mk | 150 | ||||
-rw-r--r-- | solenv/gbuild/ExternalProject.mk | 10 | ||||
-rw-r--r-- | solenv/gbuild/LinkTarget.mk | 2 | ||||
-rw-r--r-- | solenv/gbuild/TargetLocations.mk | 3 | ||||
-rw-r--r-- | solenv/gbuild/UnpackedTarball.mk | 54 | ||||
-rw-r--r-- | solenv/gbuild/gbuild.mk | 1 |
6 files changed, 214 insertions, 6 deletions
diff --git a/solenv/gbuild/ExternalPackage.mk b/solenv/gbuild/ExternalPackage.mk new file mode 100644 index 000000000000..5bf1f517acb5 --- /dev/null +++ b/solenv/gbuild/ExternalPackage.mk @@ -0,0 +1,150 @@ +# -*- 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/. +# + +# ExternalPackage class + +# This class extends Package to reliably deliver header files (and +# possibly other kinds of files) from unpacked tarballs. The problem +# with using Package is that the unpacked files' timestamps do not +# depend on the extraction time; when the project's tarball is updated, +# some header files might have been changed, but it is likely their +# timestamps will be older than these of the headers delivered from the +# previous version, so the delivered headers will not be updated. +# +# Uff, I hope this is at least partially understandable :-) + +$(dir $(call gb_ExternalPackage_get_target,%)).dir : + $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@)) + +$(dir $(call gb_ExternalPackage_get_target,%))%/.dir : + $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@)) + +$(call gb_ExternalPackage_get_target,%) : + $(call gb_Output_announce,$*,$(true),EPK,2) + touch $@ + +$(call gb_ExternalPackage_get_clean_target,%) : + $(call gb_Output_announce,$*,$(false),EPK,2) + rm -f $(call gb_ExternalPackage_get_target,$*) + +gb_ExternalPackage_get_packagename = External/$(1) + +# Create and register a new ExternalPackage +# +# The base directory of the package is the directory of the unpacked +# tarball. +# +# gb_ExternalPackage_ExternalPackage name unpacked +define gb_ExternalPackage_ExternalPackage +$(call gb_ExternalPackage_ExternalPackage_internal,$(1),$(2)) + +$$(eval $$(call gb_Module_register_target,$(call gb_ExternalPackage_get_target,$(1)),$(call gb_ExternalPackage_get_clean_target,$(1)))) + +endef + +# Create a new ExternalPackage +# +# This function should only be used in implementations of other gbuild +# classes. +# +# gb_ExternalPackage_ExternalPackage_internal name unpacked +define gb_ExternalPackage_ExternalPackage_internal +$(call gb_Package_Package_internal,$(call gb_ExternalPackage_get_packagename,$(1)),$(call gb_UnpackedTarball_get_dir,$(2))) +$(call gb_Package_use_unpacked,$(call gb_ExternalPackage_get_packagename,$(1)),$(2)) + +$(call gb_ExternalPackage_get_target,$(1)) : $(call gb_Package_get_target,$(call gb_ExternalPackage_get_packagename,$(1))) +$(call gb_ExternalPackage_get_target,$(1)) :| $(dir $(call gb_ExternalPackage_get_target,$(1))).dir +$(call gb_ExternalPackage_get_clean_target,$(1)) : $(call gb_Package_get_clean_target,$(call gb_ExternalPackage_get_packagename,$(1))) + +gb_ExternalPackage_UNPACKED_$(1) := $(2) + +endef + +# Add a file +# +# See gb_Package_add_file for details. +# +# gb_ExternalPackage_add_file package dest src +define gb_ExternalPackage_add_file +$(call gb_Package_add_file,$(call gb_ExternalPackage_get_packagename,$(1)),$(2),$(3)) + +endef + +# Add several files at once +# +# See gb_Package_add_files for details. +# +# gb_ExternalPackage_add_files package destdir file(s) +define gb_ExternalPackage_add_files +$(call gb_Package_add_files,$(call gb_ExternalPackage_get_packagename,$(1)),$(2),$(3)) + +endef + +# Add several files at once +# +# See gb_Package_add_files_with_dir for details. +# +# gb_ExternalPackage_add_files_with_dir package destdir file(s) +define gb_ExternalPackage_add_files_with_dir +$(call gb_Package_add_files_with_dir,$(call gb_ExternalPackage_get_packagename,$(1)),$(2),$(3)) + +endef + +define gb_ExternalPackage__add_file +$(call gb_UnpackedTarball_mark_output_file,$(gb_ExternalPackage_UNPACKED_$(1)),$(2)) + +endef + +# Add an unpacked file +# +# See gb_Package_add_file for details. +# +# gb_ExternalPackage_add_unpacked_file package dest src +define gb_ExternalPackage_add_unpacked_file +$(call gb_Package_add_file,$(call gb_ExternalPackage_get_packagename,$(1)),$(2),$(3)) +$(call gb_ExternalPackage__add_file,$(1),$(3)) + +endef + +define gb_ExternalPackage__add_files +$(foreach file,$(2),$(call gb_ExternalPackage__add_file,$(1),$(file))) + +endef + +# Add several unpacked files at once +# +# See gb_Package_add_files for details. +# +# gb_ExternalPackage_add_unpacked_files package destdir file(s) +define gb_ExternalPackage_add_unpacked_files +$(call gb_Package_add_files,$(call gb_ExternalPackage_get_packagename,$(1)),$(2),$(3)) +$(call gb_ExternalPackage__add_files,$(1),$(3)) + +endef + +# Add several unpacked files at once +# +# See gb_Package_add_files_with_dir for details. +# +# gb_ExternalPackage_add_unpacked_files_with_dir package destdir file(s) +define gb_ExternalPackage_add_unpacked_files_with_dir +$(call gb_Package_add_files_with_dir,$(call gb_ExternalPackage_get_packagename,$(1)),$(2),$(3)) +$(call gb_ExternalPackage__add_files,$(1),$(3)) + +endef + +# Package files from build of an external project +# +# gb_ExternalPackage_use_external_project package external +define gb_ExternalPackage_use_external_project +$(call gb_Package_use_external_project,$(call gb_ExternalPackage_get_packagename,$(1),$(2))) + +endef + +# vim: set noet sw=4 ts=4: diff --git a/solenv/gbuild/ExternalProject.mk b/solenv/gbuild/ExternalProject.mk index 15ca6bc0b616..5731cbf65360 100644 --- a/solenv/gbuild/ExternalProject.mk +++ b/solenv/gbuild/ExternalProject.mk @@ -12,10 +12,12 @@ # Handles build of an external project # Build of an external typically uses three gbuild classes: -# ExternalProject, Package and UnpackedTarball. The first step is to -# prepare sources using UnpackedTarball. The tarball is passed to an -# ExternalProject, which handles the build proper and the results are -# delivered by a Package. +# ExternalProject, ExternalPackage or Package, and UnpackedTarball. The +# first step is to prepare sources using UnpackedTarball. The tarball is +# passed to an ExternalProject, which handles the build proper and the +# results are delivered by an ExternalPackage (or Package, again; +# Package is sufficient if no files--e.g., headers--from the unpacked +# tarball need to be delivered.) # # ExternalProject has no gbuild abstraction for actually building the # external code, so it is necessary to define rule(s) and recipe(s) to diff --git a/solenv/gbuild/LinkTarget.mk b/solenv/gbuild/LinkTarget.mk index 7a34de069103..dae113895c1a 100644 --- a/solenv/gbuild/LinkTarget.mk +++ b/solenv/gbuild/LinkTarget.mk @@ -1100,7 +1100,7 @@ endef # Use sources from unpacked tarball of an external project define gb_LinkTarget_use_unpacked -$(call gb_LinkTarget_get_external_headers_target,$(1)) :| $(call gb_UnpackedTarball_get_target,$(2)) +$(call gb_LinkTarget_get_external_headers_target,$(1)) :| $(call gb_UnpackedTarball_get_final_target,$(2)) endef diff --git a/solenv/gbuild/TargetLocations.mk b/solenv/gbuild/TargetLocations.mk index 58a540732f02..a9de72cf462b 100644 --- a/solenv/gbuild/TargetLocations.mk +++ b/solenv/gbuild/TargetLocations.mk @@ -102,6 +102,7 @@ gb_Executable_get_headers_target = $(WORKDIR)/Headers/Executable/$(1) gb_ExtensionTarget_get_target = $(WORKDIR)/ExtensionTarget/$(1).oxt gb_ExtensionTarget_get_rootdir = $(WORKDIR)/ExtensionTarget/$(1)/root gb_ExtensionTarget_get_workdir = $(WORKDIR)/ExtensionTarget/$(1) +gb_ExternalPackage_get_target = $(WORKDIR)/ExternalPackage/$(1) gb_ExternalProject_get_statedir = $(WORKDIR)/ExternalProject/$(1) gb_ExternalProject_get_preparation_target = $(WORKDIR)/ExternalProject/$(1).prepare gb_ExternalProject_get_state_target = $(WORKDIR)/ExternalProject/$(1)/$(2) @@ -166,6 +167,7 @@ gb_UnoApiHeadersTarget_get_comprehensive_target = $(WORKDIR)/UnoApiHeadersTarget gb_UnoApiHeadersTarget_get_target = $(WORKDIR)/UnoApiHeadersTarget/$(1)/normal.done gb_UnoApiPartTarget_get_target = $(WORKDIR)/UnoApiPartTarget/$(1) gb_UnpackedTarball_get_dir = $(WORKDIR)/UnpackedTarball/$(1) +gb_UnpackedTarball_get_final_target = $(WORKDIR)/UnpackedTarball/$(1).update gb_UnpackedTarball_get_target = $(WORKDIR)/UnpackedTarball/$(1).done gb_UnpackedTarball_get_preparation_target = $(WORKDIR)/UnpackedTarball/$(1).prepare gb_UnpackedTarget_get_target = $(WORKDIR)/UnpackedTarget/$(1) @@ -217,6 +219,7 @@ $(eval $(call gb_Helper_make_clean_targets,\ CliUnoApiTarget \ ComponentTarget \ ComponentsTarget \ + ExternalPackage \ ExtensionTarget \ InstallModule \ InstallModuleTarget \ diff --git a/solenv/gbuild/UnpackedTarball.mk b/solenv/gbuild/UnpackedTarball.mk index eef8170bbe03..8dcf05543ad9 100644 --- a/solenv/gbuild/UnpackedTarball.mk +++ b/solenv/gbuild/UnpackedTarball.mk @@ -163,6 +163,9 @@ $(call gb_UnpackedTarball_get_preparation_target,%) : $(call gb_UnpackedTarball_get_target,%) : $(call gb_UnpackedTarball__command,$@,$*,$(call gb_UnpackedTarball_get_dir,$*)) +$(call gb_UnpackedTarball_get_final_target,%) : + touch $@ + .PHONY : $(call gb_UnpackedTarball_get_clean_target,%) $(call gb_UnpackedTarball_get_clean_target,%) : $(call gb_Output_announce,$*,$(false),PAT,2) @@ -194,6 +197,9 @@ $(call gb_UnpackedTarball_get_preparation_target,$(1)) : $(call gb_UnpackedTarba $(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 +$(call gb_UnpackedTarball_get_final_target,$(1)) : $(call gb_UnpackedTarball_get_target,$(1)) + +private gb_UnpackedTarball_PATTERN_RULES_$(1) := endef @@ -201,7 +207,7 @@ endef 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)))) +$$(eval $$(call gb_Module_register_target,$(call gb_UnpackedTarball_get_final_target,$(1)),$(call gb_UnpackedTarball_get_clean_target,$(1)))) endef @@ -311,4 +317,50 @@ $(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_POST_ACTION := $(strip $(2 endef +define gb_UnpackedTarbal__make_pattern_rule +$(call gb_UnpackedTarball_get_dir,$(1))/%$(2) : + touch $$@ + +$(eval gb_UnpackedTarball_PATTERN_RULES_$(1) += $(2)) + +endef + +define gb_UnpackedTarbal__ensure_pattern_rule +$(if $(filter $(2),$(gb_UnpackedTarball_PATTERN_RULES_$(1))),,$(call gb_UnpackedTarbal__make_pattern_rule,$(1),$(2))) + +endef + +define gb_UnpackedTarbal__make_file_rule +$(call gb_UnpackedTarball_get_dir,$(1))/$(2) : + touch $$@ + +endef + +# Mark a source file to be used outside of this module +# +# This results in the timestamp of the file being updated, so a possible +# change is recognized properly by other files depending on it. The +# update is run after possible post action. +# +# See description of class ExternalPackage for more information. +# +# gb_UnpackedTarball_mark_output_file unpacked file +define gb_UnpackedTarball_mark_output_file +$(call gb_UnpackedTarball_get_final_target,$(1)) : $(call gb_UnpackedTarball_get_dir,$(1))/$(2) +$(call gb_UnpackedTarball_get_dir,$(1))/$(2) : $(call gb_UnpackedTarball_get_target,$(1)) +$(if $(suffix $(2)),\ + $(call gb_UnpackedTarbal__ensure_pattern_rule,$(1),$(suffix $(2))),\ + $(call gb_UnpackedTarbal__make_file_rule,$(1),$(2)) \ +) + +endef + +# Mark several source files to be used outside of this module +# +# gb_UnpackedTarball_mark_output_files unpacked file(s) +define gb_UnpackedTarball_mark_output_files +$(foreach file,$(2),$(call gb_UnpackedTarball_mark_output_file,$(1),$(file))) + +endef + # vim: set noet sw=4 ts=4: diff --git a/solenv/gbuild/gbuild.mk b/solenv/gbuild/gbuild.mk index 55442de5b329..8334ead0df64 100644 --- a/solenv/gbuild/gbuild.mk +++ b/solenv/gbuild/gbuild.mk @@ -313,6 +313,7 @@ include $(foreach class, \ Executable \ SdiTarget \ Package \ + ExternalPackage \ CustomTarget \ ExternalProject \ Pagein \ |