summaryrefslogtreecommitdiff
path: root/solenv
diff options
context:
space:
mode:
authorJan-Marek Glogowski <glogow@fbihome.de>2021-05-19 07:55:40 +0200
committerJan-Marek Glogowski <glogow@fbihome.de>2021-12-06 19:38:29 +0100
commit1c9a40299d328c78c035ca63ccdf22c5c669a03b (patch)
treece32754685a0b147ffb701efbbcaa24fa7e36083 /solenv
parentba8b3751fa184c04b9dde4c371b7902e0a9271ff (diff)
gbuild: create services.rdb from built components
... and introduce the --enable-services-rdb-from-build option. Currently the build handles global build options redundant in a few places: * in Repository*mk + modules - the "real" build dependencies * the full services.rdb generation * the static UNO constructor map generation Also the component files don't reflect the really built components and so the RDB services generation must handle the whole options to select the correct components. So this optionally replaces the latter two by generating the list of components and it's constructors from the build itself. As a consequence, component files must now be split, so they reflect the real components in the libraries, otherwise the static constructor list will have missing symbols. IMHO this is more natural, as it happens in the same place already handling these build options for the sourcecode. This also adds a convenience helper to add multiple component files: gb_Library_set_componentfiles This is WIP and currently just works for the stripped WASM build, which introduces many more split component files in later patches. It also explicitly filters the gb_Rdb__URECOMPONENTS and the CppunitTest related components from the services.rdb. Maybe there is a good way to do this properly. Change-Id: I1b38a6f2c1e5221f18d7e5e756c30263b555d962 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/126185 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
Diffstat (limited to 'solenv')
-rwxr-xr-xsolenv/bin/constructors.py27
-rwxr-xr-xsolenv/bin/native-code.py9
-rw-r--r--solenv/gbuild/ComponentTarget.mk4
-rw-r--r--solenv/gbuild/Library.mk9
-rw-r--r--solenv/gbuild/Rdb.mk3
5 files changed, 52 insertions, 0 deletions
diff --git a/solenv/bin/constructors.py b/solenv/bin/constructors.py
new file mode 100755
index 000000000000..1237da17142d
--- /dev/null
+++ b/solenv/bin/constructors.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+
+# Call $0 <file with a list of component file paths>
+# Dumps all the implementing constructors to stdout
+
+import xml.sax
+import os.path
+import sys
+
+constructors = list()
+
+class ComponentHandler(xml.sax.ContentHandler):
+ def startElement(self, tag, attributes):
+ if tag == "implementation" and "constructor" in attributes:
+ constructors.append(attributes["constructor"])
+
+if __name__ == "__main__":
+ parser = xml.sax.make_parser()
+ parser.setFeature(xml.sax.handler.feature_namespaces, 0)
+ parser.setContentHandler(ComponentHandler())
+ for filename in sys.argv[1:]:
+ with open(filename, "r") as components_listfile:
+ for line in components_listfile:
+ for component_filename in line.strip().split():
+ parser.parse(component_filename)
+ constructors.sort()
+ print("\n".join(constructors))
diff --git a/solenv/bin/native-code.py b/solenv/bin/native-code.py
index d1d36140f0ab..7abb6c97ac4d 100755
--- a/solenv/bin/native-code.py
+++ b/solenv/bin/native-code.py
@@ -817,6 +817,7 @@ opts.add_option("-j", "--java-guard", action="store_true", help="include externa
opts.add_option("-g", "--group", action="append", help="group of implementations to make available in application", dest="groups")
opts.add_option("-r", "--limit-rdb", action="append", help="instead of outputting native-code.cxx, limit the services.rdb only to the services defined by the groups", dest="services")
opts.add_option("-C", "--pure-c", action="store_true", help="do not print extern \"C\"", dest="pure_c", default=False)
+opts.add_option("-c", "--constructors", help="file with the list of constructors", dest="constructors_file")
(options, args) = opts.parse_args()
@@ -830,6 +831,9 @@ if options.groups:
else:
full_constructor_map[constructor] = True
+if not options.groups and options.constructors_file:
+ options.groups = factory_map.keys()
+
# dict of all the factories that we need according to -g's
full_factory_map = {}
if options.groups:
@@ -846,6 +850,11 @@ if options.services:
limit_rdb(options.services, full_factory_map, full_constructor_map)
exit(0)
+if options.constructors_file:
+ with open(options.constructors_file, "r") as constructors:
+ for line in constructors:
+ full_constructor_map[line.strip()] = True
+
print ("""/*
* This is a generated file. Do not edit.
*
diff --git a/solenv/gbuild/ComponentTarget.mk b/solenv/gbuild/ComponentTarget.mk
index 067f24e35ce6..de88ae1f5177 100644
--- a/solenv/gbuild/ComponentTarget.mk
+++ b/solenv/gbuild/ComponentTarget.mk
@@ -17,6 +17,8 @@
# the License at http://www.apache.org/licenses/LICENSE-2.0 .
#
+gb_ComponentTarget__ALLCOMPONENTS :=
+
gb_ComponentTarget_XSLTCOMMANDFILE := $(SRCDIR)/solenv/bin/createcomponent.xslt
gb_ComponentTarget_get_source = $(SRCDIR)/$(1).component
@@ -58,6 +60,8 @@ $(call gb_ComponentTarget_get_target,$(1)) : COMPONENTSOURCE := $(call gb_Compon
$(call gb_ComponentTarget_get_target,$(1)) : $(call gb_ComponentTarget_get_source,$(patsubst CppunitTest/%,%,$(1)))
+$(if $(filter $(1),$(patsubst CppunitTest/%,%,$(1))),$(eval gb_ComponentTarget__ALLCOMPONENTS += $(1)))
+
endef
# vim: set noet sw=4:
diff --git a/solenv/gbuild/Library.mk b/solenv/gbuild/Library.mk
index 9894951d3260..36911dee31a0 100644
--- a/solenv/gbuild/Library.mk
+++ b/solenv/gbuild/Library.mk
@@ -133,6 +133,8 @@ endef
# But the component target also must be delivered; use the target
# gb_Library_get_exports_target for that purpose, since it is already
# the "final" target of the Library...
+#
+# call gb_Library_set_componentfile,library,componentfile
define gb_Library_set_componentfile
$(call gb_ComponentTarget_ComponentTarget,$(2),\
$(call gb_Library__get_componentprefix,$(gb_Library__get_name)),\
@@ -143,6 +145,13 @@ $(call gb_ComponentTarget_get_target,$(2)) :| \
$(call gb_Library_get_target,$(gb_Library__get_name))
$(call gb_Library_get_clean_target,$(gb_Library__get_name)) : \
$(call gb_ComponentTarget_get_clean_target,$(2))
+
+endef
+
+# call gb_Library_set_componentfiles,library,componentfiles
+define gb_Library_set_componentfiles
+$(foreach comp,$(2),$(call gb_Library_set_componentfile,$(1),$(comp)))
+
endef
gb_Library__get_name = $(if $(filter $(1),$(gb_MERGEDLIBS)),merged,$(1))
diff --git a/solenv/gbuild/Rdb.mk b/solenv/gbuild/Rdb.mk
index ccbb313d9ce8..d59ab043180a 100644
--- a/solenv/gbuild/Rdb.mk
+++ b/solenv/gbuild/Rdb.mk
@@ -7,6 +7,8 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
+gb_Rdb__URECOMPONENTS :=
+
gb_Rdb__get_install_target = $(INSTROOT)/$(LIBO_ETC_FOLDER)/services/$(1).rdb
define gb_Rdb__command
@@ -59,6 +61,7 @@ endef
define gb_Rdb_add_component
$(call gb_Rdb_get_target,$(1)) : $(call gb_ComponentTarget_get_target,$(2))
$(call gb_Rdb_get_target,$(1)) : COMPONENTS += $(2)
+$(if $(filter ure/services,$(1)),$(eval gb_Rdb__URECOMPONENTS += $(2)))
endef