build: Make doc-po-update and doc-pot-update targets idempotent.

It used to be that the running the doc-po-update and doc-pot-update targets
would redo the same work on every run.  This change splits the problem in
smaller chunks and specifies build dependencies in a way that outputs only get
rebuilt when their inputs changed.

* po/doc/local.mk (DOC_PO_FILES): Harmonize escapes.
(POT_OPTIONS): Re-indent uniformly.
(doc-po-update-%, doc-po-update-cookbook-%): Re-implement with...
(make-update-po-files-rule): ... this new function.
(TMP_POT_FILES): Remove variable.
(%D%/%.pot, %D%/guix-manual.pot): New pattern rules.
(doc-pot-update, doc-po-update): Adjust prerequisites accordingly.
This commit is contained in:
Maxim Cournoyer 2021-04-29 09:45:39 -04:00
parent eaf79d319d
commit 0d353b06ec
No known key found for this signature in database
GPG key ID: 1260E46482E63562

View file

@ -1,5 +1,6 @@
# GNU Guix --- Functional package management for GNU # GNU Guix --- Functional package management for GNU
# Copyright © 2018 Julien Lepiller <julien@lepiller.eu> # Copyright © 2018 Julien Lepiller <julien@lepiller.eu>
# Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
# #
# This file is part of GNU Guix. # This file is part of GNU Guix.
# #
@ -16,7 +17,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. # along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
DOC_PO_FILES= \ DOC_PO_FILES = \
%D%/guix-manual.es.po \ %D%/guix-manual.es.po \
%D%/guix-manual.de.po \ %D%/guix-manual.de.po \
%D%/guix-manual.fa.po \ %D%/guix-manual.fa.po \
@ -28,11 +29,11 @@ DOC_PO_FILES= \
%D%/guix-manual.sk.po \ %D%/guix-manual.sk.po \
%D%/guix-manual.zh_CN.po %D%/guix-manual.zh_CN.po
DOC_COOKBOOK_PO_FILES= \ DOC_COOKBOOK_PO_FILES = \
%D%/guix-cookbook.de.po \ %D%/guix-cookbook.de.po \
%D%/guix-cookbook.fa.po \ %D%/guix-cookbook.fa.po \
%D%/guix-cookbook.fr.po \ %D%/guix-cookbook.fr.po \
%D%/guix-cookbook.ko.po \ %D%/guix-cookbook.ko.po \
%D%/guix-cookbook.zh_Hans.po %D%/guix-cookbook.zh_Hans.po
EXTRA_DIST = \ EXTRA_DIST = \
@ -41,76 +42,37 @@ EXTRA_DIST = \
$(DOC_PO_FILES) \ $(DOC_PO_FILES) \
$(DOC_COOKBOOK_PO_FILES) $(DOC_COOKBOOK_PO_FILES)
POT_OPTIONS = --package-name "guix manual" --package-version "$(VERSION)" \ POT_OPTIONS = \
--copyright-holder "the authors of Guix (msgids)" \ --package-name "guix manual" --package-version "$(VERSION)" \
--msgid-bugs-address "bug-guix@gnu.org" --copyright-holder "the authors of Guix (msgids)" \
--msgid-bugs-address "bug-guix@gnu.org"
doc-po-update-%: # make-download-po-files-rule PO_FILES POT_FILE_INPUT
@lang=`echo "$@" | sed -e's/^doc-po-update-//'` ; \ define make-update-po-files-rule
output="$(srcdir)/po/doc/guix-manual.$$lang.po" ; \ $(1): $(2)
input="$(srcdir)/po/doc/guix-manual.pot" ; \ @if ! [ -f "$$@" ]; then \
if test -f "$$output"; then \ echo "File $$po_file does not exist. If you are a translator, \
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ you can create it with 'msginit'." 1>&2; \
echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $$output $$input"; \ exit 1; \
cd $(srcdir) \ fi && \
&& { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ lang=$$$$(echo $$@ | $(SED) -E 's|.*\.([^.]*)\.po$$$$|\1|') && \
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ echo $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) \
$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) "$$output" "$$input";; \ --lang=$$$${lang} "$$@" "$$<" && \
*) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$$$${lang} "$$@" "$$<"
$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} "$$output" "$$input";; \ endef
esac; \
}; \
touch "$$output"; \
else \
echo "File $$output does not exist. If you are a translator, you can create it with 'msginit'." 1>&2; \
exit 1; \
fi
doc-po-update-cookbook-%: %D%/%.pot: $(srcdir)/doc/%.texi
@lang=`echo "$@" | sed -e's/^doc-po-update-cookbook-//'` ; \
output="$(srcdir)/po/doc/guix-cookbook.$$lang.po" ; \
input="$(srcdir)/po/doc/guix-cookbook.pot" ; \
if test -f "$$output"; then \
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $$output $$input"; \
cd $(srcdir) \
&& { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) "$$output" "$$input";; \
*) \
$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} "$$output" "$$input";; \
esac; \
}; \
touch "$$output"; \
else \
echo "File $$output does not exist. If you are a translator, you can create it with 'msginit'." 1>&2; \
exit 1; \
fi
$(srcdir)/po/doc/%.pot-update: doc/%.texi
$(AM_V_PO4A)$(PO4A_UPDATEPO) -M UTF-8 -f texinfo -m "$<" \ $(AM_V_PO4A)$(PO4A_UPDATEPO) -M UTF-8 -f texinfo -m "$<" \
-p "$$(echo $@ | sed 's|-update||')" $(POT_OPTIONS) -p "$@" $(POT_OPTIONS) && \
@touch "$$(echo $@ | sed 's|-update||')" touch $@
TMP_POT_FILES = contributing.pot guix.pot %D%/guix-manual.pot: %D%/guix.pot %D%/contributing.pot
msgcat $< > $@
doc-pot-update: $(eval $(call make-update-po-files-rule,$(DOC_PO_FILES),%D%/guix-manual.pot))
for f in $(TMP_POT_FILES); do \ $(eval $(call make-update-po-files-rule,\
$(MAKE) $(srcdir)/po/doc/$$f-update; \ $(DOC_COOKBOOK_PO_FILES),%D%/guix-cookbook.pot))
done
$(MAKE) $(srcdir)/po/doc/guix-cookbook.pot-update;
msgcat $(addprefix $(srcdir)/po/doc/, $(TMP_POT_FILES)) > $(srcdir)/po/doc/guix-manual.pot
rm -f $(addprefix $(srcdir)/po/doc/, $(TMP_POT_FILES))
doc-po-update: doc-pot-update doc-pot-update: %D%/guix-manual.pot %D%/guix-cookbook.pot
for f in $(DOC_PO_FILES); do \ doc-po-update: $(DOC_PO_FILES) $(DOC_COOKBOOK_PO_FILES)
lang="`echo "$$f" | $(SED) -es'|.*/guix-manual\.\(.*\)\.po$$|\1|g'`"; \ .PHONY: doc-pot-update doc-po-update
$(MAKE) "doc-po-update-$$lang"; \
done
for f in $(DOC_COOKBOOK_PO_FILES); do \
lang="`echo "$$f" | $(SED) -es'|.*/guix-cookbook\.\(.*\)\.po$$|\1|g'`"; \
$(MAKE) "doc-po-update-cookbook-$$lang"; \
done
.PHONY: doc-po-update doc-pot-update