Kaydet (Commit) 98a852fe authored tarafından David Tardon's avatar David Tardon

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
üst 9f42a829
# -*- 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:
...@@ -12,10 +12,12 @@ ...@@ -12,10 +12,12 @@
# Handles build of an external project # Handles build of an external project
# Build of an external typically uses three gbuild classes: # Build of an external typically uses three gbuild classes:
# ExternalProject, Package and UnpackedTarball. The first step is to # ExternalProject, ExternalPackage or Package, and UnpackedTarball. The
# prepare sources using UnpackedTarball. The tarball is passed to an # first step is to prepare sources using UnpackedTarball. The tarball is
# ExternalProject, which handles the build proper and the results are # passed to an ExternalProject, which handles the build proper and the
# delivered by a Package. # 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 # ExternalProject has no gbuild abstraction for actually building the
# external code, so it is necessary to define rule(s) and recipe(s) to # external code, so it is necessary to define rule(s) and recipe(s) to
......
...@@ -1100,7 +1100,7 @@ endef ...@@ -1100,7 +1100,7 @@ endef
# Use sources from unpacked tarball of an external project # Use sources from unpacked tarball of an external project
define gb_LinkTarget_use_unpacked 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 endef
......
...@@ -102,6 +102,7 @@ gb_Executable_get_headers_target = $(WORKDIR)/Headers/Executable/$(1) ...@@ -102,6 +102,7 @@ gb_Executable_get_headers_target = $(WORKDIR)/Headers/Executable/$(1)
gb_ExtensionTarget_get_target = $(WORKDIR)/ExtensionTarget/$(1).oxt gb_ExtensionTarget_get_target = $(WORKDIR)/ExtensionTarget/$(1).oxt
gb_ExtensionTarget_get_rootdir = $(WORKDIR)/ExtensionTarget/$(1)/root gb_ExtensionTarget_get_rootdir = $(WORKDIR)/ExtensionTarget/$(1)/root
gb_ExtensionTarget_get_workdir = $(WORKDIR)/ExtensionTarget/$(1) gb_ExtensionTarget_get_workdir = $(WORKDIR)/ExtensionTarget/$(1)
gb_ExternalPackage_get_target = $(WORKDIR)/ExternalPackage/$(1)
gb_ExternalProject_get_statedir = $(WORKDIR)/ExternalProject/$(1) gb_ExternalProject_get_statedir = $(WORKDIR)/ExternalProject/$(1)
gb_ExternalProject_get_preparation_target = $(WORKDIR)/ExternalProject/$(1).prepare gb_ExternalProject_get_preparation_target = $(WORKDIR)/ExternalProject/$(1).prepare
gb_ExternalProject_get_state_target = $(WORKDIR)/ExternalProject/$(1)/$(2) gb_ExternalProject_get_state_target = $(WORKDIR)/ExternalProject/$(1)/$(2)
...@@ -166,6 +167,7 @@ gb_UnoApiHeadersTarget_get_comprehensive_target = $(WORKDIR)/UnoApiHeadersTarget ...@@ -166,6 +167,7 @@ gb_UnoApiHeadersTarget_get_comprehensive_target = $(WORKDIR)/UnoApiHeadersTarget
gb_UnoApiHeadersTarget_get_target = $(WORKDIR)/UnoApiHeadersTarget/$(1)/normal.done gb_UnoApiHeadersTarget_get_target = $(WORKDIR)/UnoApiHeadersTarget/$(1)/normal.done
gb_UnoApiPartTarget_get_target = $(WORKDIR)/UnoApiPartTarget/$(1) gb_UnoApiPartTarget_get_target = $(WORKDIR)/UnoApiPartTarget/$(1)
gb_UnpackedTarball_get_dir = $(WORKDIR)/UnpackedTarball/$(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_target = $(WORKDIR)/UnpackedTarball/$(1).done
gb_UnpackedTarball_get_preparation_target = $(WORKDIR)/UnpackedTarball/$(1).prepare gb_UnpackedTarball_get_preparation_target = $(WORKDIR)/UnpackedTarball/$(1).prepare
gb_UnpackedTarget_get_target = $(WORKDIR)/UnpackedTarget/$(1) gb_UnpackedTarget_get_target = $(WORKDIR)/UnpackedTarget/$(1)
...@@ -217,6 +219,7 @@ $(eval $(call gb_Helper_make_clean_targets,\ ...@@ -217,6 +219,7 @@ $(eval $(call gb_Helper_make_clean_targets,\
CliUnoApiTarget \ CliUnoApiTarget \
ComponentTarget \ ComponentTarget \
ComponentsTarget \ ComponentsTarget \
ExternalPackage \
ExtensionTarget \ ExtensionTarget \
InstallModule \ InstallModule \
InstallModuleTarget \ InstallModuleTarget \
......
...@@ -163,6 +163,9 @@ $(call gb_UnpackedTarball_get_preparation_target,%) : ...@@ -163,6 +163,9 @@ $(call gb_UnpackedTarball_get_preparation_target,%) :
$(call gb_UnpackedTarball_get_target,%) : $(call gb_UnpackedTarball_get_target,%) :
$(call gb_UnpackedTarball__command,$@,$*,$(call gb_UnpackedTarball_get_dir,$*)) $(call gb_UnpackedTarball__command,$@,$*,$(call gb_UnpackedTarball_get_dir,$*))
$(call gb_UnpackedTarball_get_final_target,%) :
touch $@
.PHONY : $(call gb_UnpackedTarball_get_clean_target,%) .PHONY : $(call gb_UnpackedTarball_get_clean_target,%)
$(call gb_UnpackedTarball_get_clean_target,%) : $(call gb_UnpackedTarball_get_clean_target,%) :
$(call gb_Output_announce,$*,$(false),PAT,2) $(call gb_Output_announce,$*,$(false),PAT,2)
...@@ -194,6 +197,9 @@ $(call gb_UnpackedTarball_get_preparation_target,$(1)) : $(call gb_UnpackedTarba ...@@ -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_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)) : $(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_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 endef
...@@ -201,7 +207,7 @@ endef ...@@ -201,7 +207,7 @@ endef
define gb_UnpackedTarball_UnpackedTarball define gb_UnpackedTarball_UnpackedTarball
$(call gb_UnpackedTarball_UnpackedTarball_internal,$(1)) $(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 endef
...@@ -311,4 +317,50 @@ $(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_POST_ACTION := $(strip $(2 ...@@ -311,4 +317,50 @@ $(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_POST_ACTION := $(strip $(2
endef 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: # vim: set noet sw=4 ts=4:
...@@ -313,6 +313,7 @@ include $(foreach class, \ ...@@ -313,6 +313,7 @@ include $(foreach class, \
Executable \ Executable \
SdiTarget \ SdiTarget \
Package \ Package \
ExternalPackage \
CustomTarget \ CustomTarget \
ExternalProject \ ExternalProject \
Pagein \ Pagein \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment