summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--solenv/gbuild/ExternalPackage.mk150
-rw-r--r--solenv/gbuild/ExternalProject.mk10
-rw-r--r--solenv/gbuild/LinkTarget.mk2
-rw-r--r--solenv/gbuild/TargetLocations.mk3
-rw-r--r--solenv/gbuild/UnpackedTarball.mk54
-rw-r--r--solenv/gbuild/gbuild.mk1
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 \