build: Make doc-po-update and doc-pot-update targets idempotent.
authorMaxim Cournoyer <maxim.cournoyer@gmail.com>
Thu, 29 Apr 2021 13:45:39 +0000 (09:45 -0400)
committerMaxim Cournoyer <maxim.cournoyer@gmail.com>
Thu, 29 Apr 2021 19:30:27 +0000 (15:30 -0400)
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.

po/doc/local.mk

dissimilarity index 70%
index 90cb6a7..da43c0a 100644 (file)
-# GNU Guix --- Functional package management for GNU
-# Copyright © 2018 Julien Lepiller <julien@lepiller.eu>
-#
-# This file is part of GNU Guix.
-#
-# GNU Guix is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or (at
-# your option) any later version.
-#
-# GNU Guix is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
-
-DOC_PO_FILES=                                  \
-  %D%/guix-manual.es.po                                \
-  %D%/guix-manual.de.po                                \
-  %D%/guix-manual.fa.po                                \
-  %D%/guix-manual.fr.po                                \
-  %D%/guix-manual.it.po                                \
-  %D%/guix-manual.ko.po                                \
-  %D%/guix-manual.pt_BR.po                     \
-  %D%/guix-manual.ru.po                                \
-  %D%/guix-manual.sk.po                                \
-  %D%/guix-manual.zh_CN.po
-
-DOC_COOKBOOK_PO_FILES=                                 \
-  %D%/guix-cookbook.de.po                              \
-  %D%/guix-cookbook.fa.po                              \
-  %D%/guix-cookbook.fr.po                              \
-  %D%/guix-cookbook.ko.po                              \
-  %D%/guix-cookbook.zh_Hans.po
-
-EXTRA_DIST = \
-  %D%/guix-manual.pot \
-  %D%/guix-cookbook.pot \
-  $(DOC_PO_FILES) \
-  $(DOC_COOKBOOK_PO_FILES)
-
-POT_OPTIONS = --package-name "guix manual" --package-version "$(VERSION)" \
-                 --copyright-holder "the authors of Guix (msgids)" \
-                         --msgid-bugs-address "bug-guix@gnu.org"
-
-doc-po-update-%:
-       @lang=`echo "$@" | sed -e's/^doc-po-update-//'` ; \
-       output="$(srcdir)/po/doc/guix-manual.$$lang.po" ; \
-       input="$(srcdir)/po/doc/guix-manual.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
-
-doc-po-update-cookbook-%:
-       @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 "$<" \
-               -p "$$(echo $@ | sed 's|-update||')" $(POT_OPTIONS)
-       @touch "$$(echo $@ | sed 's|-update||')"
-
-TMP_POT_FILES = contributing.pot guix.pot
-
-doc-pot-update:
-       for f in $(TMP_POT_FILES); do           \
-         $(MAKE) $(srcdir)/po/doc/$$f-update;  \
-       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
-       for f in $(DOC_PO_FILES); do                                            \
-         lang="`echo "$$f" | $(SED) -es'|.*/guix-manual\.\(.*\)\.po$$|\1|g'`"; \
-         $(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
+# GNU Guix --- Functional package management for GNU
+# Copyright © 2018 Julien Lepiller <julien@lepiller.eu>
+# Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+#
+# This file is part of GNU Guix.
+#
+# GNU Guix is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or (at
+# your option) any later version.
+#
+# GNU Guix is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+DOC_PO_FILES =                                 \
+  %D%/guix-manual.es.po                                \
+  %D%/guix-manual.de.po                                \
+  %D%/guix-manual.fa.po                                \
+  %D%/guix-manual.fr.po                                \
+  %D%/guix-manual.it.po                                \
+  %D%/guix-manual.ko.po                                \
+  %D%/guix-manual.pt_BR.po                     \
+  %D%/guix-manual.ru.po                                \
+  %D%/guix-manual.sk.po                                \
+  %D%/guix-manual.zh_CN.po
+
+DOC_COOKBOOK_PO_FILES =                                \
+  %D%/guix-cookbook.de.po                      \
+  %D%/guix-cookbook.fa.po                      \
+  %D%/guix-cookbook.fr.po                      \
+  %D%/guix-cookbook.ko.po                      \
+  %D%/guix-cookbook.zh_Hans.po
+
+EXTRA_DIST = \
+  %D%/guix-manual.pot \
+  %D%/guix-cookbook.pot \
+  $(DOC_PO_FILES) \
+  $(DOC_COOKBOOK_PO_FILES)
+
+POT_OPTIONS = \
+       --package-name "guix manual" --package-version "$(VERSION)"     \
+       --copyright-holder "the authors of Guix (msgids)"               \
+       --msgid-bugs-address "bug-guix@gnu.org"
+
+# make-download-po-files-rule PO_FILES POT_FILE_INPUT
+define make-update-po-files-rule
+$(1): $(2)
+       @if ! [ -f "$$@" ]; then \
+           echo "File $$po_file does not exist.  If you are a translator, \
+you can create it with 'msginit'." 1>&2; \
+           exit 1; \
+       fi && \
+       lang=$$$$(echo $$@ | $(SED) -E 's|.*\.([^.]*)\.po$$$$|\1|') && \
+       echo $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) \
+         --lang=$$$${lang} "$$@" "$$<" && \
+       $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$$$${lang} "$$@" "$$<"
+endef
+
+%D%/%.pot: $(srcdir)/doc/%.texi
+       $(AM_V_PO4A)$(PO4A_UPDATEPO) -M UTF-8 -f texinfo -m "$<" \
+          -p "$@" $(POT_OPTIONS) && \
+       touch $@
+
+%D%/guix-manual.pot: %D%/guix.pot %D%/contributing.pot
+       msgcat $< > $@
+
+$(eval $(call make-update-po-files-rule,$(DOC_PO_FILES),%D%/guix-manual.pot))
+$(eval $(call make-update-po-files-rule,\
+  $(DOC_COOKBOOK_PO_FILES),%D%/guix-cookbook.pot))
+
+doc-pot-update: %D%/guix-manual.pot %D%/guix-cookbook.pot
+doc-po-update: $(DOC_PO_FILES) $(DOC_COOKBOOK_PO_FILES)
+.PHONY: doc-pot-update doc-po-update