summaryrefslogtreecommitdiffstats
path: root/xml/Makefile.am
diff options
context:
space:
mode:
Diffstat (limited to 'xml/Makefile.am')
-rw-r--r--xml/Makefile.am320
1 files changed, 320 insertions, 0 deletions
diff --git a/xml/Makefile.am b/xml/Makefile.am
new file mode 100644
index 0000000..70dc8ea
--- /dev/null
+++ b/xml/Makefile.am
@@ -0,0 +1,320 @@
+#
+# Copyright 2004-2022 the Pacemaker project contributors
+#
+# The version control history for this file may have further details.
+#
+# This source code is licensed under the GNU General Public License version 2
+# or later (GPLv2+) WITHOUT ANY WARRANTY.
+#
+
+include $(top_srcdir)/mk/common.mk
+
+noarch_pkgconfig_DATA = $(builddir)/pacemaker-schemas.pc
+
+# Pacemaker has 3 schemas: the CIB schema, the API schema (for command-line
+# tool XML output), and a legacy schema for crm_mon --as-xml.
+#
+# See README.md for details on updating CIB schema files (API is similar)
+
+# The CIB and crm_mon schemas are installed directly in CRM_SCHEMA_DIRECTORY
+# for historical reasons, while the API schema is installed in a subdirectory.
+APIdir = $(CRM_SCHEMA_DIRECTORY)/api
+CIBdir = $(CRM_SCHEMA_DIRECTORY)
+MONdir = $(CRM_SCHEMA_DIRECTORY)
+
+basexsltdir = $(CRM_SCHEMA_DIRECTORY)/base
+dist_basexslt_DATA = $(srcdir)/base/access-render-2.xsl
+
+# Extract a sorted list of available numeric schema versions
+# from filenames like NAME-MAJOR[.MINOR][.MINOR-MINOR].rng
+numeric_versions = $(shell ls -1 $(1) \
+ | sed -n -e 's/^.*-\([0-9][0-9.]*\).rng$$/\1/p' \
+ | sort -u -t. -k 1,1n -k 2,2n -k 3,3n)
+
+# @COMPAT: pacemaker-next is deprecated since 2.1.5
+version_pairs = $(join \
+ $(1),$(addprefix \
+ -,$(wordlist \
+ 2,$(words $(1)),$(1) \
+ ) next \
+ ) \
+ )
+
+version_pairs_last = $(wordlist \
+ $(words \
+ $(wordlist \
+ 2,$(1),$(2) \
+ ) \
+ ),$(1),$(2) \
+ )
+
+# NOTE: All files in API_request_base, CIB_cfg_base, API_base, and CIB_base
+# need to start with a unique prefix. These variables all get iterated over
+# and globbed, and two files starting with the same prefix will cause
+# problems.
+
+# Names of API schemas that form the choices for pacemaker-result content
+API_request_base = command-output \
+ crm_attribute \
+ crm_error \
+ crm_mon \
+ crm_resource \
+ crm_rule \
+ crm_shadow \
+ crm_simulate \
+ crmadmin \
+ digests \
+ pacemakerd \
+ stonith_admin \
+ version
+
+# Names of CIB schemas that form the choices for cib/configuration content
+CIB_cfg_base = options nodes resources constraints fencing acls tags alerts
+
+# Names of all schemas (including top level and those included by others)
+API_base = $(API_request_base) \
+ any-element \
+ failure \
+ fence-event \
+ generic-list \
+ instruction \
+ item \
+ node-attrs \
+ node-history \
+ nodes \
+ patchset \
+ resources \
+ status \
+ subprocess-output
+CIB_base = cib $(CIB_cfg_base) status score rule nvset
+
+# Static schema files and transforms (only CIB has transforms)
+#
+# This is more complicated than it should be due to the need to support
+# VPATH builds and "make distcheck". We need the absolute paths for reliable
+# substitution back and forth, and relative paths for distributed files.
+API_abs_files = $(foreach base,$(API_base),$(wildcard $(abs_srcdir)/api/$(base)-*.rng))
+CIB_abs_files = $(foreach base,$(CIB_base),$(wildcard $(abs_srcdir)/$(base).rng $(abs_srcdir)/$(base)-*.rng))
+CIB_abs_xsl = $(abs_srcdir)/upgrade-1.3.xsl \
+ $(abs_srcdir)/upgrade-2.10.xsl \
+ $(wildcard $(abs_srcdir)/upgrade-*enter.xsl) \
+ $(wildcard $(abs_srcdir)/upgrade-*leave.xsl)
+MON_abs_files = $(abs_srcdir)/crm_mon.rng
+API_files = $(foreach base,$(API_base),$(wildcard $(srcdir)/api/$(base)-*.rng))
+CIB_files = $(foreach base,$(CIB_base),$(wildcard $(srcdir)/$(base).rng $(srcdir)/$(base)-*.rng))
+CIB_xsl = $(srcdir)/upgrade-1.3.xsl \
+ $(srcdir)/upgrade-2.10.xsl \
+ $(wildcard $(srcdir)/upgrade-*enter.xsl) \
+ $(wildcard $(srcdir)/upgrade-*leave.xsl)
+MON_files = $(srcdir)/crm_mon.rng
+
+# Sorted lists of all numeric schema versions
+API_numeric_versions = $(call numeric_versions,${API_files})
+CIB_numeric_versions = $(call numeric_versions,${CIB_files})
+MON_numeric_versions = $(call numeric_versions,$(wildcard $(srcdir)/api/crm_mon*.rng))
+
+# The highest numeric schema version
+API_max ?= $(lastword $(API_numeric_versions))
+CIB_max ?= $(lastword $(CIB_numeric_versions))
+MON_max ?= $(lastword $(MON_numeric_versions))
+
+# Sorted lists of all schema versions (including "next")
+# @COMPAT: pacemaker-next is deprecated since 2.1.5
+API_versions = next $(API_numeric_versions)
+CIB_versions = next $(CIB_numeric_versions)
+
+# Build tree locations of static schema files and transforms (for VPATH builds)
+API_build_copies = $(foreach f,$(API_abs_files),$(subst $(abs_srcdir),$(abs_builddir),$(f)))
+CIB_build_copies = $(foreach f,$(CIB_abs_files) $(CIB_abs_xsl),$(subst $(abs_srcdir),$(abs_builddir),$(f)))
+MON_build_copies = $(foreach f,$(MON_abs_files),$(subst $(abs_srcdir),$(abs_builddir),$(f)))
+
+# Dynamically generated schema files
+API_generated = api/api-result.rng $(foreach base,$(API_versions),api/api-result-$(base).rng)
+CIB_generated = pacemaker.rng $(foreach base,$(CIB_versions),pacemaker-$(base).rng) versions.rng
+MON_generated = crm_mon.rng
+
+CIB_version_pairs = $(call version_pairs,${CIB_numeric_versions})
+CIB_version_pairs_cnt = $(words ${CIB_version_pairs})
+CIB_version_pairs_last = $(call version_pairs_last,${CIB_version_pairs_cnt},${CIB_version_pairs})
+
+dist_API_DATA = $(API_files)
+dist_CIB_DATA = $(CIB_files) $(CIB_xsl)
+
+nodist_API_DATA = $(API_generated)
+nodist_CIB_DATA = $(CIB_generated)
+nodist_MON_DATA = $(MON_generated)
+
+EXTRA_DIST = README.md \
+ best-match.sh \
+ cibtr-2.rng \
+ context-of.xsl \
+ ocf-meta2man.xsl \
+ regression.sh \
+ upgrade-2.10-roundtrip.xsl \
+ upgrade-detail.xsl \
+ xslt_cibtr-2.rng \
+ assets \
+ test-2 \
+ test-2-enter \
+ test-2-leave \
+ test-2-roundtrip
+
+cib-versions:
+ @echo "Max: $(CIB_max)"
+ @echo "Available: $(CIB_versions)"
+
+api-versions:
+ @echo "Max: $(API_max)"
+ @echo "Available: $(API_versions)"
+
+# Dynamically generated top-level API schema
+api/api-result.rng: api/api-result-$(API_max).rng
+ $(AM_V_at)$(MKDIR_P) api # might not exist in VPATH build
+ $(AM_V_SCHEMA)cp $(top_builddir)/xml/$< $@
+
+api/api-result-%.rng: $(API_build_copies) best-match.sh Makefile.am
+ $(AM_V_at)echo '<?xml version="1.0" encoding="UTF-8"?>' > $@
+ $(AM_V_at)echo '<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">' >> $@
+ $(AM_V_at)echo ' <start>' >> $@
+ $(AM_V_at)echo ' <element name="pacemaker-result">' >> $@
+ $(AM_V_at)echo ' <attribute name="api-version"> <text /> </attribute>' >> $@
+ $(AM_V_at)echo ' <attribute name="request"> <text /> </attribute>' >> $@
+ $(AM_V_at)echo ' <optional>' >> $@
+ $(AM_V_at)echo ' <choice>' >> $@
+ $(AM_V_at)for rng in $(API_request_base); do $(srcdir)/best-match.sh api/$$rng $(*) $(@) " " || :; done
+ $(AM_V_at)echo ' </choice>' >> $@
+ $(AM_V_at)echo ' </optional>' >> $@
+ $(AM_V_at)$(srcdir)/best-match.sh api/status $(*) $(@) " " || :
+ $(AM_V_at)echo ' </element>' >> $@
+ $(AM_V_at)echo ' </start>' >> $@
+ $(AM_V_SCHEMA)echo '</grammar>' >> $@
+
+crm_mon.rng: api/crm_mon-$(MON_max).rng
+ $(AM_V_at)echo '<?xml version="1.0" encoding="UTF-8"?>' > $@
+ $(AM_V_at)echo '<grammar xmlns="http://relaxng.org/ns/structure/1.0"' >> $@
+ $(AM_V_at)echo ' datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">' >> $@
+ $(AM_V_at)echo ' <start>' >> $@
+ $(AM_V_at)echo ' <ref name="element-crm_mon-old"/>' >> $@
+ $(AM_V_at)echo ' </start>' >> $@
+ $(AM_V_at)echo ' <define name="element-crm_mon-old">' >> $@
+ $(AM_V_at)echo ' <element name="crm_mon">' >> $@
+ $(AM_V_at)echo ' <attribute name="version"> <text/> </attribute>' >> $@
+ $(AM_V_at)echo ' <externalRef href="$(<)" />' >> $@
+ $(AM_V_at)echo ' </element>' >> $@
+ $(AM_V_at)echo ' </define>' >> $@
+ $(AM_V_SCHEMA)echo '</grammar>' >> $@
+
+# Dynamically generated top-level CIB schema
+pacemaker.rng: pacemaker-$(CIB_max).rng
+ $(AM_V_SCHEMA)cp $(top_builddir)/xml/$< $@
+
+pacemaker-%.rng: $(CIB_build_copies) best-match.sh Makefile.am
+ $(AM_V_at)echo '<?xml version="1.0" encoding="UTF-8"?>' > $@
+ $(AM_V_at)echo '<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">' >> $@
+ $(AM_V_at)echo ' <start>' >> $@
+ $(AM_V_at)echo ' <element name="cib">' >> $@
+ $(AM_V_at)$(srcdir)/best-match.sh cib $(*) $(@) " "
+ $(AM_V_at)echo ' <element name="configuration">' >> $@
+ $(AM_V_at)echo ' <interleave>' >> $@
+ $(AM_V_at)for rng in $(CIB_cfg_base); do $(srcdir)/best-match.sh $$rng $(*) $(@) " " || :; done
+ $(AM_V_at)echo ' </interleave>' >> $@
+ $(AM_V_at)echo ' </element>' >> $@
+ $(AM_V_at)echo ' <optional>' >> $@
+ $(AM_V_at)echo ' <element name="status">' >> $@
+ $(AM_V_at)$(srcdir)/best-match.sh status $(*) $(@) " "
+ $(AM_V_at)echo ' </element>' >> $@
+ $(AM_V_at)echo ' </optional>' >> $@
+ $(AM_V_at)echo ' </element>' >> $@
+ $(AM_V_at)echo ' </start>' >> $@
+ $(AM_V_SCHEMA)echo '</grammar>' >> $@
+
+# Dynamically generated CIB schema listing all pacemaker versions
+versions.rng: pacemaker-$(CIB_max).rng Makefile.am
+ $(AM_V_at)echo '<?xml version="1.0" encoding="UTF-8"?>' > $@
+ $(AM_V_at)echo '<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">' >> $@
+ $(AM_V_at)echo ' <start>' >> $@
+ $(AM_V_at)echo ' <interleave>' >> $@
+ $(AM_V_at)echo ' <optional>' >> $@
+ $(AM_V_at)echo ' <attribute name="validate-with">' >> $@
+ $(AM_V_at)echo ' <choice>' >> $@
+ $(AM_V_at)echo ' <value>none</value>' >> $@
+ $(AM_V_at)echo ' <value>pacemaker-0.6</value>' >> $@
+ $(AM_V_at)echo ' <value>transitional-0.6</value>' >> $@
+ $(AM_V_at)echo ' <value>pacemaker-0.7</value>' >> $@
+ $(AM_V_at)echo ' <value>pacemaker-1.1</value>' >> $@
+ $(AM_V_at)for rng in $(CIB_versions); do echo " <value>pacemaker-$$rng</value>" >> $@; done
+ $(AM_V_at)echo ' </choice>' >> $@
+ $(AM_V_at)echo ' </attribute>' >> $@
+ $(AM_V_at)echo ' </optional>' >> $@
+ $(AM_V_at)echo ' <attribute name="admin_epoch"><data type="nonNegativeInteger"/></attribute>' >> $@
+ $(AM_V_at)echo ' <attribute name="epoch"><data type="nonNegativeInteger"/></attribute>' >> $@
+ $(AM_V_at)echo ' <attribute name="num_updates"><data type="nonNegativeInteger"/></attribute>' >> $@
+ $(AM_V_at)echo ' </interleave>' >> $@
+ $(AM_V_at)echo ' </start>' >> $@
+ $(AM_V_SCHEMA)echo '</grammar>' >> $@
+
+# diff fails with ec=2 if no predecessor is found;
+# this uses '=' GNU extension to sed, if that's not available,
+# one can use: hline=`echo "$${p}" | grep -Fn "$${hunk}" | cut -d: -f1`;
+# XXX: use line information from hunk to avoid "not detected" for ambiguity
+version_diff = \
+ @for p in $(1); do \
+ set `echo "$${p}" | tr '-' ' '`; \
+ echo "\#\#\# *-$$2.rng vs. predecessor"; \
+ for v in *-$$2.rng; do \
+ echo "\#\#\#\# $${v} vs. predecessor"; b=`echo "$${v}" | cut -d- -f1`; \
+ old=`./best-match.sh $${b} $$1`; \
+ p=`diff -u "$${old}" "$${v}" 2>/dev/null`; \
+ case $$? in \
+ 1) echo "$${p}" | sed -n -e '/^@@ /!d;=;p' \
+ -e ':l;n;/^\([- ]\|+.*<[^ />]\+\([^/>]\+="ID\|>$$\)\)/bl;s/^[+ ]\(.*\)/\1/p' \
+ | while read hline; do \
+ read h && read i || break; \
+ iline=`grep -Fn "$${i}" "$${v}" | cut -d: -f1`; \
+ ctxt="(not detected)"; \
+ if test `echo "$${iline}" | wc -l` -eq 1; then \
+ ctxt=`{ sed -n -e "1,$$(($${iline}-1))p" "$${v}"; \
+ echo "<inject id=\"GOAL\"/>$${i}"; \
+ sed -n -e "$$(($${iline}+1)),$$ p" "$${v}"; \
+ } | $(XSLTPROC) --param skip 1 context-of.xsl -`; \
+ fi; \
+ echo "$${p}" | sed -n -e "$$(($${hline}-2)),$${hline}!d" \
+ -e '/^\(+++\|---\)/p'; \
+ echo "$${h} context: $${ctxt}"; \
+ echo "$${p}" | sed -n -e "1,$${hline}d" \
+ -e '/^\(---\|@@ \)/be;p;d;:e;n;be'; \
+ done; \
+ ;; \
+ 2) echo "\#\#\#\#\# $${v} has no predecessor";; \
+ esac; \
+ done; \
+ done
+
+diff: best-match.sh
+ @echo "# Comparing changes in + since $(CIB_max)"
+ $(call version_diff,${CIB_version_pairs_last})
+
+fulldiff: best-match.sh
+ @echo "# Comparing all changes across all the subsequent increments"
+ $(call version_diff,${CIB_version_pairs})
+
+CLEANFILES = $(API_generated) $(CIB_generated) $(MON_generated)
+
+# Remove pacemaker schema files generated by *any* source version. This allows
+# "make -C xml clean" to have the desired effect when checking out an earlier
+# revision in a source tree.
+clean-local:
+ if [ "x$(srcdir)" != "x$(builddir)" ]; then \
+ rm -f $(API_build_copies) $(CIB_build_copies) $(MON_build_copies); \
+ fi
+ rm -f $(builddir)/pacemaker-[0-9]*.[0-9]*.rng
+
+# Enable ability to use $@ in prerequisite
+.SECONDEXPANSION:
+
+# For VPATH builds, copy the static schema files into the build tree
+$(API_build_copies) $(CIB_build_copies) $(MON_build_copies): $$(subst $(abs_builddir),$(srcdir),$$(@))
+ $(AM_V_GEN)if [ "x$(srcdir)" != "x$(builddir)" ]; then \
+ $(MKDIR_P) "$(dir $(@))"; \
+ cp "$(<)" "$(@)"; \
+ fi